问题标签 [command-substitution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
791 浏览

shell - POSIX shell:转义反引号命令替换中的续行

我正在写一个 shell,我对POSIX shell 规范有点困惑。说我有命令:

shell应该输出

或者

?

换句话说,在命令替换中从文本中删除转义后是否再次删除了续行?POSIX 规范似乎指定不会再次发生行继续删除,但是,我测试的所有 shell(bash、dash 和 busybox 的 ash)再次运行行继续删除,导致测试脚本输出ab.

脚本解释:

命令替换中的脚本部分未转义,产生:

现在,如果再次运行续行删除,它将删除反斜杠换行符对,在echo "ab"命令替换中生成命令,否则反斜杠换行符对仍将位于a和之间b

0 投票
2 回答
1889 浏览

linux - 将多行命令输出传递给 echo 仅输出一行

我的文件夹中有 2 个文件,如下所示

列出文件显示正常。但是为什么下面的命令会在 bash 中将两行合并为一行?

0 投票
2 回答
233 浏览

bash - awk 命令因命令替换而失败

运行此命令失败:

它给出了以下错误:

但是,如果我运行替换的命令,我会得到:

我可以这样运行:

而且效果很好。我究竟做错了什么?

@ChrisLear 给了我一个可行的解决方案,但我仍然不太明白命令解决方案在做什么。这是工作代码:

周围的单引号{%sprint}被删除。为什么那些单引号会破坏命令替换?

编辑:将反引号更改为$(...)符号。还添加了我不明白的解决方案。

0 投票
1 回答
30 浏览

git - 提取部分空格分隔的字符串

如果有多个 Git 存储库包含一个文件mergedriver.info

这个文件看起来总是这样:

由 Git 合并驱动程序触发的脚本正在评估此文件:

在这种情况下,我不理解 sed 的行为。

为此mergedriver.info

日志输出如下所示:

起初我尝试使用 sed -n 1p/2p 和 head/tail -1 读取 mergedriver.info,但不幸的$(git cat-file -p HEAD:mergedriver.info)是,运行此脚本的两个不同平台的输出不同:

平台一:

平台二:

如何解决这个问题呢?

0 投票
2 回答
256 浏览

bash - 如何引用命令替换,使其表现得像“$@”?

$*相当于$1 $2 $3...- 在所有空格上拆分。

"$*"相当于"$1 $2 $3..."- 这里没有分裂。

"$@"等效于"$1" "$2" "$3"...- split on arguments(每个参数都单独引用)。

如何引用$(command) 以便它以与"$@"处理参数相同的方式处理命令的输出行?

我要解决的问题:

我有一个备份功能,它通过参数获取文件并备份每个文件(例如:)backup file1 file_2 "file 3"。我想快速备份另一个命令返回的文件。

mycmd返回三个文件(每行一个):file1file_2file 3(包含一个空格)。如果我运行以下命令:

它相当于运行,并且由于不存在文件file3backup file1 file_2 file 3会导致错误。但是以这种方式运行它:

相当于运行:

他们都不够好。

如何使用命令替换来获得等效于:的调用backup "file1" "file_2" "file 3"

目前我唯一的解决方法是:

0 投票
1 回答
36 浏览

bash - Bash - 这被称为定义吗?

我对 bash 很陌生,

我学会了使用这样的变量:

如果上面的代码是使用 avariable调用的,你如何调用下面的方法?这叫做 a using adefinition吗?

我在询问第二种方法的正确术语。

0 投票
1 回答
731 浏览

python - docker CMD 中的命令替换

使用:

导致错误docker run

有没有办法像$(pipenv --venv)/bin/python3在 CMD 部分中那样进行评估命令替换?

0 投票
2 回答
183 浏览

tcl - 在 TCL 中处理之前如何防止替换?

我正在调用这样的 TCL 程序-

现在这里$a本身就是这样的——

当我尝试运行它时,$a它被扩展,它变成-

这会产生一个错误,因为现在我们似乎有额外的参数,比如 -c。

我想要的是$a作为一个整体,然后在程序中扩展它。

我怎么做?

我不能使用{}括号,因为我需要变量替换。我无法删除引号,因为外部引号包含args.

0 投票
2 回答
6924 浏览

bash - echo $(command) 通过命令的输出得到不同的结果

我使用的 Bash 命令:

  1. $ ssh user@myserver.com ps -aux|grep -v \"grep\"|grep "/srv/adih/server/app.js"|awk '{print $2}'

    /li>
  2. $ ssh user@myserver.com echo $(ps -aux|grep -v \"grep\"|grep "/srv/adih/server/app.js"|awk '{print $2}')

    /li>

第一个结果是正确的,第二个结果会改变我执行它的回显时间。但我不知道为什么它们不同。


我在做什么?

我的工作站资源非常有限,所以我使用远程机器来运行我的 Node.js 应用程序。ssh user@remotebox.com "cd /application && grunt serve"我在调试模式下运行它。当我命令Ctrl+C时,grunt 任务停止,但应用程序仍在调试模式下运行。我只想杀了它,我需要先得到PID。

0 投票
1 回答
1417 浏览

linux - 为什么反引号中的嵌套引号在 bash 中起作用?

更准确地说,为什么

将外部引号视为包含内部引号,而不是将变量扩展到任何引号之外?

我用来测试这个的确切命令类似于另一个 stackoverflow 问题中提出的关于使用命令替换时正确引用方法的示例:

它正确地呼应了“some path with”,而不是因为参数数量无效而抱怨。

我阅读了 Bash 的手册页,其中在“扩展”一章的“命令替换”部分中指出,新型 $() 替换保留了括号之间任何字符的含义,但是,关于反引号,它只提到反斜杠有效以有限的方式:

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着$,`\。前面没有反斜杠的第一个反引号终止命令替换。

我的第一个想法是反引号也一样,除了提到的例外,因此“引用”内部双引号,但是,我被告知事实并非如此。指出我这个方向的第二个观察是

打印“$b”。如果反引号让美元符号得到解释,那么第一个变量替换应该在调用子shell之前发生,子shell扩展字符串“$b”,结果是“hello”。根据手册页的上述摘录,我什至可以通过使用确保美元符号实际被引用

结果仍然是一样的。

第三个观察结果让我有些怀疑:

结果:“\a”

结果:一个

在这里,似乎两个反斜杠都被保留了,直到 subshel​​l 发挥作用,即使手册页指出反引号中的反斜杠在后面跟着另一个反斜杠时没有其字面意义。编辑: ^ 在这方面一切都按预期工作,我一定使用了错误的 shell(我的另一个终端中的 tcsh,并且字符与“a”不同)。

虽然我无法找出实际发生的情况,但在我寻找答案时,我遇到一些人提到关于命令替换的术语“引用上下文”,但没有任何解释它的含义或位置它被描述。我在 Bash 引用(gnu.org、tldp、man bash)或通过 DuckDuckGo 中都没有找到对“引用上下文”的任何真正引用。

除了了解正在发生的事情之外,我更希望获得一些关于如何从中辨别这种行为的参考或指导,因为我认为我可能未能将一些部分放在一起,而这些部分是自然产生的。否则我会忘记答案。

对于那些建议人们使用新式美元符号和括号替换的人:在 ca。具有数十或数百种不同专有环境的 50 年历史的 Unix 机器(不能为更新的环境丢弃 shell),当必须编写与大多数人可能使用的 shell 兼容的脚本时,这不是一种选择。

感谢任何可以帮助我的人。