首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >间接bash命令执行不像coproc预期的那样工作

间接bash命令执行不像coproc预期的那样工作
EN

Stack Overflow用户
提问于 2021-02-20 21:14:35
回答 1查看 198关注 0票数 0

我对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确实按预期工作。

这个命令必须如何正确地退出才能正常工作?我已经试过了

代码语言:javascript
复制
    `test1=`coproc` && exec "$test1" leafpad`
代码语言:javascript
复制
    `test1='coproc' && exec "$test1" leafpad`
代码语言:javascript
复制
    `test1="'coproc'" && exec "$test1" leafpad`
代码语言:javascript
复制
    `test1=`coproc` && exec '$test1' leafpad`
代码语言:javascript
复制
    `test1=`coproc` && exec `$test1` leafpad`
代码语言:javascript
复制
    `test1="coproc" && exec $test1 leafpad`
代码语言:javascript
复制
    `test1=`coproc` && exec $test1 leafpad`

还有更多的变体,但都不起作用。

2.)这是仅在命令行上的测试。但是我更需要的是在一个脚本中这样做:所以我肯定会有一些额外的引语或伪装的特殊字符。

背景:我必须执行一个包含许多参数的命令,其中一些参数被变量替换。想想yad这样的东西,在几行代码中包含所有可能的参数,但是让我们创建一个更简单的例子:

代码语言:javascript
复制
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领导,另一次不执行,作为条件分支的函数。

所以我想要的是:

代码语言:javascript
复制
if [ $something == 1 ]; then copr_this="coproc"; else copr_this=""; fi

exec '$copr_this' <mycommand, with all its quoted arguments>

而不是

代码语言:javascript
复制
if [ something == 0]; then
          lengthy command here
else
          coproc lengthy command here, exactly repeated.
fi

我已经尝试用另一种方式来管理它,这就是将完整的冗长命令放入变量中,并在条件分支中执行它:

代码语言:javascript
复制
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选项还会执行其他操作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-20 22:40:58

引用是而不是这里的问题。还有另外两个问题:

execcoproc的顺序和内置程序与二进制文件

test1="leafpad" && coproc exec "$test1"coproc exec leafpad是一样的。

test1="coproc" && exec "$test1" leafpadexec coproc leafpad是一样的。

这个顺序带来了不同:coproc execexec coproc。后者不能工作,因为exec用指定的程序替换了当前的shell。但是,coproc是一个内置命令。您的系统上没有coproc二进制文件。您只能在bash内部运行它。因此,exec失败。

命令替换与字符串

在你的剧本里。

代码语言:javascript
复制
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提供了更好的存储命令的方法。使用数组或函数代替字符串。这里我们使用一个函数:

代码语言:javascript
复制
my_command() {
  exec lengthy command
}

if ...; then
   coproc my_command
else
   my_command
fi

coproc exec

话虽如此,我真的很想知道coprocexec的结合。在我看来,coproc exec cmd似乎忽略了exec部分,并且与coproc cmd相同。如果exec在这里正常工作,那么当前的shell将被替换,您将松开COPROC数组,因此不需要coproc。不管是哪种方式,同时使用这两种方式似乎都很奇怪。你真的确定你需要那个exec吗?如果是这样的话,我很乐意听到你的理由。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66296631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档