我对 linux shell 脚本很陌生并且有一个问题:
1.) 为什么命令
test1="leafpad" && coproc exec "$test1"
在 bash 中工作(命令行,debian 衍生版 linux 上的 GNU bash 4.4.12),但是命令
test1="coproc" && exec "$test1" leafpad
才不是?错误消息:bash:exec:coproc:未找到。
而
coproc leafpad
确实按预期工作。
该命令必须如何正确引用才能使其工作?我已经试过了
test1=`coproc` && exec "$test1" leafpad
test1='coproc' && exec "$test1" leafpad
test1="'coproc'" && exec "$test1" leafpad
test1=`coproc` && exec '$test1' leafpad
test1=`coproc` && exec `$test1` leafpad
test1="coproc" && exec $test1 leafpad
test1=`coproc` && exec $test1 leafpad
还有一些变体,但它们都不起作用。
2.) 这只是命令行测试。但我更需要的是在脚本中执行此操作:所以我确信需要做一些额外的引用或伪装特殊字符。
背景:我必须执行一个命令,其中包含许多参数,其中一些被变量替换。想想像 yad 这样的东西,它的所有可能的参数都在几行中,但让我们创建一个更简单的例子:
my_codeset="437"
my_line="20"
my_filename="somthing.txt"
if [ $value == 0 ]; then my_tabwidth='--tab-width=10'; else my_tabwidth=""; fi # set tabs or not
leafpad --codeset="$my_codeset" "$my_tabwidth" --jump="$my_line" "$my_filename"
其中给定的变量是变化的主题,作为之前用户交互的函数。
现在这个完整的命令(原来大约有 6 行代码)需要以两种变体执行:一次由 coproc 领导,另一次不是,作为条件分支的函数。
所以我想要的是:
if [ $something == 1 ]; then copr_this="coproc"; else copr_this=""; fi
exec '$copr_this' <mycommand, with all its quoted arguments>
代替
if [ something == 0]; then
lengthy command here
else
coproc lengthy command here, exactly repeated.
fi
我已经尝试过另一种方式来管理它,即将完整的冗长命令放在一个变量中,并在一个条件分支中执行它:
my_command=`lengthy command with some arguments $arg1 $arg2 ...`
if...
exec "$my_command"
else
coproc exec "$my_command"
fi
这也停止了错误消息“未找到”。不同的引用方式并没有解决它,而只会产生不同的错误消息。我没能找到这个任务的正确引用。如何正确阅读此引用?
当然,我可以重复代码中的 6 行命令,但我很确定这样做会更方便。
如开头所述:只要不涉及 coproc,间接命令执行就可以在命令行(也可以在脚本内)工作。我无法让它与 coproc 一起使用。
任何帮助和提示表示赞赏。
在@Socowi 第一次回答后更新:
感谢您全面而快速的回答,Socowi。你显然是对的,coproc
不服从命令。所以我现在明白为什么我的尝试必须失败。该exec
命令仅在我的实验期间添加。我开始时没有这个,但在没有成功之后,我认为它会有所帮助。这只是一种绝望的行为。该行中的反向引号my_command=`lengthy command with some arguments $arg1 $arg2 ...`
是一个错字,应该有正常的引号,正如你所指出的,因为我打算在if
当然中执行命令。我可能会按照您指示我的方式前往,function {...}
在脚本中使用。但与此同时,在对这个问题进行了实验后,我得出了一个惊人的解决方案:对我来说很惊讶,因为coproc
不听命令和不听命令之间的区别leafpad
用它的二进制作为一个命令。所以应该很清楚,这test1='coproc' && test2='leafpad' && "$test1 $test2"
将失败并显示错误消息bash: coproc leafpad: command not found.
,这是真的。但是现在:为什么test1='coproc' && test2='leafpad' && /bin/bash -c "$test1 $test2"
要做这项工作,启动 Leafpad,允许在 bash 中并行输入更多命令,就像我只输入一样leafpad &
?但是这次从一个变量执行内置函数(或关键字?)和命令,当尝试直接在第一个 bash 实例中输入它时被拒绝。bash 的第一个实例是正确的,第二个实例也应该是正确的,还是我有一个错误的观点?为什么它会这样工作?该-c
选项除了执行命令之外还有什么作用吗?