Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Bash:在函数中使用xargs/parallel参数进行变量替换_Macos_Bash_Xargs - Fatal编程技术网

Macos Bash:在函数中使用xargs/parallel参数进行变量替换

Macos Bash:在函数中使用xargs/parallel参数进行变量替换,macos,bash,xargs,Macos,Bash,Xargs,我已经为这个Bash脚本挣扎了大约一周,试图做一件看起来最简单的事情。我使用fswatch查看给定文件夹,并生成添加到其中的任何单个文件的文件名作为输出。该输出通过管道传输到xargs,然后运行带有多个命令的函数,这些命令使用fswatch/xargs传递的文件名以及变量/参数替换 #!/bin/bash compressor() { filepath="filepath" mkdir -m 777 /Users/lr/Desktop/Watch/${filepath##/}_

我已经为这个Bash脚本挣扎了大约一周,试图做一件看起来最简单的事情。我使用
fswatch
查看给定文件夹,并生成添加到其中的任何单个文件的文件名作为输出。该输出通过管道传输到
xargs
,然后运行带有多个命令的函数,这些命令使用
fswatch
/
xargs
传递的文件名以及变量/参数替换

#!/bin/bash

compressor() {
    filepath="filepath"
    mkdir -m 777 /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
    mv ${filepath} /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
    /Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath##/} -settingpath /Users/lr/Documents/CONVERTHQTEST.cmprstng -locationpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath%.*}.mp4
}

export -f compressor

/usr/local/Cellar/fswatch/1.8.0/bin/fswatch -0 -v --event Created --event MovedTo /Users/lr/Desktop/Watch |
    xargs -0 -n1 -I'filepath' bash -c compressor 'filepath'
在最简单的配置中,我通过管道将输出传输到
xargs
,并使用
xargs
运行使用参数替换的程序,一切正常。然后我收到一个请求,要求脚本为添加的每个文件创建一个新文件夹,将文件移动到该文件夹,然后运行命令

使用多个命令时,似乎什么都不起作用。我无法让
xargs
将参数传递给函数,以便函数可以使用参数定义变量并在文件路径中进行变量替换。如果我在函数中执行
xargs-I'filepath'命令“filepath”
,然后执行
filepath=“filepath”
,我最终会创建一个名为
filepath\u PROCESSING
的文件,而不是在中替换
fswatch
中的参数


如何使用
xargs
将参数传递给函数?

两件事:您误解了。它们是位置参数(例如1、2、3等),因此您的函数可以定义如下:

compressor() {
    filepath="$1"
    # define a variable rather than including this 5 times
    process="/Users/lr/Desktop/Watch/${filepath#/}_PROCESSING"
    mkdir -m 777 "$process"
    mv "$filepath" "$process"
    /Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath "$process/${filepath#/}" -settingpath /Users/lr/Documents/CONVERTHQTEST.cmprstng -locationpath "$process/${filepath%.*}.mp4"
}
然后,当您调用
bash-c
时,它只需要一个参数(参见下面的注释),但您要传递两个参数。尝试一些引用,它应该可以工作:

fswatch -0 -v --event Created --event MovedTo /Users/lr/Desktop/Watch |
    xargs -0 -n1 -I filepath bash -c 'compressor "filepath"'
[
-c
将]处理选项后,从第一个非选项参数读取并执行命令,然后退出。所有剩余的参数都将指定给位置参数,从$0开始

显然,我无法复制您的设置,但在bash版本3和4中,这对我来说很好:

#!/bin/bash    
make_noise() {
    echo "$1" "$1" "$1" "$1"
}
export -f make_noise
echo "foo bar" | xargs -I {} bash -c "make_noise '{}'"
尝试:


我也试过这个:
#/bin/bash/usr/local/ceral/fswatch/1.8.0/bin/fswatch-0-v——创建事件——事件移动到/Users/leftright/Desktop/Watch | parallel-0-n1-q-x-v'mkdir-m777/Users/leftright/Desktop/Watch/“{/}”u处理/\;mv“{}”/Users/leftright/Desktop/Watch/“{/}”\u PROCESSING/\/Applications/Compressor.app/Contents/MacOS/Compressor-computergroup“This Computer”-jobpath/Users/leftright/Desktop/Watch/“{/}”\u PROCESSING/“{/}”-settingpath/Users/leftright/Documents/CONVERTHQTEST.cmprstng-locationpath/Users/leftright/Desktop/Watch/“{/}”\u PROCESSING/“{/}”.mp4\”显然这不是很清晰;如果它对问题很重要,应该通过编辑添加,以便其他人可以阅读。感谢您的帮助。现在使用
xargs
bash-c
我得到以下错误:
bash:compressor:command not found
。在执行
fswatch
xargs
之前,我添加了
export-f
,但似乎没有任何区别。当我将
xargs
替换为
parallel
时,即使应用了
-v
标志,我也没有收到任何反馈。还有其他组件可以让函数作为命令的参数工作吗?对我来说,这很好;请参阅我的编辑以获得一个最小的测试用例。在稍微调整它之后,您的原始示例工作得非常好。我还没试过用parallel。我现在唯一的问题是fswatch递归地监视子目录,因此脚本的原始设计创建了一个子目录循环。我将进行修改,以便将新文件发送到fswatch不监视的另一个文件夹。完成后,我将发布完成的脚本。再次感谢!
#!/bin/bash

compressor() {
    filepath="$1"
    mkdir -m 777 /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
    mv ${filepath} /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
    /Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath##/} -settingpath /Users/lr/Documents/CONVERTHQTEST.cmprstng -locationpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath%.*}.mp4
}

export -f compressor

/usr/local/Cellar/fswatch/1.8.0/bin/fswatch -0 -v --event Created --event MovedTo /Users/lr/Desktop/Watch |
    parallel -0 compressor