我对linux脚本非常陌生,我有一个问题:
1.)为什么命令
test1="leafpad" && coproc exec "$test1"
使用bash (命令行,GNU bash 4.4.12,在debian派生linux上),但是命令
test1="coproc" && exec "$test1" leafpad
不是吗?错误消息: bash: exec: coproc: Not。
而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的第一个答复后更新:
谢谢你的全面和快速的回答,索科维。显然,关于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"要做这个工作,启动传单,允许以bash并行方式输入进一步的命令,就像我只输入了leafpad &一样?但这一次,执行这两个,内置(或关键字?)以及来自变量的命令,当试图在第一个bash实例中直接输入它时,该命令被拒绝。对于第一个bash实例,什么也应该是第二个实例,或者我是否有一个错误的透视图?它为什么会这样工作?除了执行命令之外,-c选项还会执行其他操作吗?
发布于 2021-02-20 22:40:58
引用是而不是这里的问题。还有另外两个问题:
exec和coproc的顺序和内置程序与二进制文件
test1="leafpad" && coproc exec "$test1"和coproc exec leafpad是一样的。
test1="coproc" && exec "$test1" leafpad和exec coproc leafpad是一样的。
这个顺序带来了不同:coproc exec和exec coproc。后者不能工作,因为exec用指定的程序替换了当前的shell。但是,coproc是一个内置命令。您的系统上没有coproc二进制文件。您只能在bash内部运行它。因此,exec失败。
命令替换与字符串
在你的剧本里。
my_command=`lengthy command`
if ...; then
exec "$my_command"
else
coproc exec "$my_command"
fi..。您没有将lengthy command存储在变量中,但您运行了该命令,并将其输出(v=`cmd`与v=$(cmd)相同)存储在if之前。然后在if中,尝试将命令的输出作为另一个命令执行。
要将命令存储为字符串并在以后执行,可以使用my_command="lengthy command"; $my_command (注意有意丢失的引号)。然而,bash提供了更好的存储命令的方法。使用数组或函数代替字符串。这里我们使用一个函数:
my_command() {
exec lengthy command
}
if ...; then
coproc my_command
else
my_command
ficoproc exec
话虽如此,我真的很想知道coproc和exec的结合。在我看来,coproc exec cmd似乎忽略了exec部分,并且与coproc cmd相同。如果exec在这里正常工作,那么当前的shell将被替换,您将松开COPROC数组,因此不需要coproc。不管是哪种方式,同时使用这两种方式似乎都很奇怪。你真的确定你需要那个exec吗?如果是这样的话,我很乐意听到你的理由。
https://stackoverflow.com/questions/66296631
复制相似问题