【问题标题】:Bash - back tick invocation blocks for everBash - 永远的回勾调用块
【发布时间】:2016-07-18 18:46:52
【问题描述】:

这很可能是我在某个地方犯的一个愚蠢的错误,但我似乎无法弄清楚发生了什么。希望我能在这里找到一些帮助。

我有一个脚本callee.sh,它需要一些可选变量$1,$2,$3 等......它在脚本中做了一堆回显(所以,多行输出)我只想最后一行作为结果。其他行只是调试状态报告。

当尝试将结果分配给这样的变量时

result=`./callee.sh | tail -n 1`完美运行

但是,如果它需要参数

result=`./callee.sh param1 param2 param2 | tail -n 1`代码将永远阻塞,永远不会进入callee.sh

只是为了比较我尝试运行

result=`./callee.sh`,这可行,但所有行都附加到一行(没关系)

但正在运行

result=`./callee.sh param1 param2 param2` 也永远挂起。从不输入callee.sh

我做错了什么?我应该怎么做?

【问题讨论】:

  • 命令./callee.sh param1 param2 param2(不带反引号)运行需要多长时间?
  • 感谢您指出错字。固定
  • 如果./callee.sh 运行完成但./callee.sh param1 param2 param2 永远挂起,那么您的问题就在callee.sh 内部。
  • edit你的问题包含一个minimal reproducible example(基本上是添加callee.sh的内容)。没有它,只能对问题进行猜测。
  • result 仍将包含输出中的换行符;如果您看到一行,那是因为您没有正确引用参数扩展。 (比较 echo $resultecho "$result"。)

标签: linux bash shell backticks


【解决方案1】:

没有代码不知道,但简短的回答是使用

result=$(./callee.sh ...)

而不是反引号。 $(...) 正确处理嵌套括号。

另外,使用/ 代替\

并且,正如@Leon 所指出的,使用tail -1tail -n 1,而不是tail -n -1

【讨论】:

  • 这主要是风格建议;虽然很好,但是解决不了OP的问题。
  • @user1763590 你怎么知道它没有进入callee.sh 而不是挂在callee.sh 中?请将callee.sh 和调用代码缩减为仍然显示问题的最小示例,然后将edit your question 包括该示例的代码,包括调用脚本和callee.sh。谢谢!
  • @chepner 通常如此,但由于 OP 实际上并未显示 param1 &c. 的内容,因此它们可能包含与反引号扩展意外交互的字符序列。我认为这值得一试:)。
  • 反引号在其中的任何内容被展开之前被解析。
  • @cxw 这个反引号只是param1 值中的另一个文字字符。它根本不影响命令替换。 foo='foo`bar'; echo `echo $foo`.
【解决方案2】:

如果对 callee.sh 的调用带有参数挂起,请尝试在带有参数的脚本之外执行它,并检查它是否也挂在那里... 无论如何,保存输出(然后打印出来)的最佳方式:

result="$(./callee.sh param1 param2 param2)"
echo "${result}" <--- this should show the line breaks

【讨论】:

  • 是的,当我这样调用脚本时它也会挂起。当我说挂起时,我的意思是永远不会输入脚本。我尝试tail inline 的原因是,否则多行输出将被附加到 1 行中,而 ``tail``` 将返回整个内容,这不是我需要的。但这无关紧要。即使没有tail,脚本也不会被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多