Questions tagged «command-substitution»

有关shell命令替换的问题(例如$(command)或`command`),其机制,正确的语法等。不要与别名混淆。


3
在Bash中的$(命令替换)中报价
在我的Bash环境中,我使用包含空格的变量,并且在命令替换中使用这些变量。不幸的是我找不到关于SE的答案。 引用变量的正确方法是什么?如果将它们嵌套,该怎么办? DIRNAME=$(dirname "$FILE") 还是我在替代词之外引用? DIRNAME="$(dirname $FILE)" 或两者? DIRNAME="$(dirname "$FILE")" 还是我会使用反引号? DIRNAME=`dirname "$FILE"` 什么是正确的方法?我如何轻松检查报价是否设置正确?

6
如何在cron标签作业中执行`date`?
我想为cron脚本创建一个日志文件,该日志文件名称中包含当前小时。这是我尝试使用的命令: 0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log 不幸的是,我在运行时收到此消息: /bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file 我尝试过date各种方式使零件逃脱,但运气不佳。是否可以在crontab文件中在线进行此操作,还是需要创建Shell脚本来执行此操作?

7
将上一个命令的输出作为参数传递给next
我有一个将数据输出到stdout(command1 -p=aaa -v=bbb -i=4)的命令。输出行可以具有以下值: rate (10%) - name: value - 10Kbps 我想grep该输出以存储该“比率”(我想这里的管道会很有用)。最后,我希望该比率成为第二个命令的参数值(假设command2 -t=${rate}) 在我这边看起来很棘手;我想更好地了解如何使用管道,grep,sed等。 我已经尝试了很多类似的组合,但是我对这些组合感到困惑: $ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}


3
了解反引号(`)
我正在尝试命令 $ b=5; echo `$b`; -bash: 5: command not found 但它不会按预期打印5。我在这里想念什么? 命令中的`(反引号/反引号)是什么意思?似乎说可以`评估其中的命令并将其替换为输出。

6
命令替换:在换行符上分割,但不分割空格
我知道我可以通过几种方法解决此问题,但是我想知道是否有一种方法可以仅使用bash内置函数来实现,否则,最有效的方法是什么。 我有一个内容如下的文件 AAA B C DDD FOO BAR 我的意思是说它只有几行,每行可能有也可能没有空格。我想运行类似的命令 cmd AAA "B C DDD" "FOO BAR" 如果我使用cmd $(< file)我得到 cmd AAA B C DDD FOO BAR 如果我用cmd "$(< file)"我得到 cmd "AAA B C DDD FOO BAR" 我如何让每行都被正确地对待一个参数?

5
为什么Shell Command Substitution吞噬了尾随的换行符?
按照下面的示例,以及我最近 在bash中的问题,结尾的换行符char哪里去了?,我想知道它为什么发生 x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p # Output is: 610a62 # The trailing newline from the 'echo' command # has been "deleted" by Command Substitution 我认为必须有一个非常重要的理由来执行shell动作,即Command Substitution,实际上从它正在替换的命令输出中删除一些数据... 但是我无法理解这一点,因为它似乎是它应该做什么的对立面..即 将命令的输出传递回脚本过程...对我来说,隐瞒一个字符似乎很奇怪,但是我想这是有道理的...我很想找出那个原因。 。

4
`curl |有什么区别?sh`和`sh -c“ $(curl)”`?
这个问题是从Server Fault 迁移过来的,因为可以在Unix&Linux Stack Exchange上回答。 迁移 2年前。 例如,一种简单的Docker安装方法是: curl -sSL https://get.docker.com/ | sh 但是,我也看到了一些类似于Docker的示例: sh -c "$(curl -sSL https://get.docker.com/)" 它们在功能上似乎相同,但是是否有理由在一个之上使用一个?还是仅仅是偏爱/审美? (值得注意的是,运行来自未知来源的脚本时要格外小心。)


1
POSIX在命令替换内对此处引用的文档有何要求?
在此问题中,有人报告了一个使用here文档的问题,该文档在$(...)命令替换中使用带引号的定界符单词,其中\文档内部行末尾的反斜杠触发换行-换行,而在命令替换之外的相同here文档可以按预期工作。 这是一个简化的示例文档: cat <<'EOT' abc ` def ghi \ jkl EOT 这包括在行尾包含一个反引号和一个反斜杠。用引号引起来,因此主体内部不会发生扩展。在所有与伯恩相似的地方,我都能找到逐字逐句输出的内容。如果我将相同文档放在命令替换中,如下所示: x=$(cat <<'EOT' abc ` def ghi \ jkl EOT ) echo "$x" 然后它们不再表现相同: dash,ash,zsh,ksh93,BusyBox的ash,mksh,和SunOS 5.10 POSIX sh都给予该文件的逐字内容,如前。 Bash 3.2针对不匹配的反引号给出了语法错误。使用匹配的反引号,它尝试将内容作为命令运行。 Bash 4.3将“ ghi”和“ jkl”折叠到一行上,但是没有错误。该--posix选项不影响此。Kusalananda 告诉我(谢谢!)的pdksh行为也是如此。 在最初的问题中,我说这是Bash解析器中的错误。是吗?[更新:是 ]我可以从POSIX(全部来自Shell命令语言定义)中找到相关文本: §2.6.3命令替换: 使用$(command)格式,在右括号后到匹配的右括号后的所有字符构成命令。可以将任何有效的Shell脚本用于命令,但仅由重定向组成的脚本会产生未指定的结果。 §2.7.4此处文档: 如果对单词的任何部分加引号,则应通过对单词执行引号删除来形成定界符,并且此处文档行不得扩展。 第2.2.1节转义符(反斜杠): 如果<newline>跟在<backslash>之后,则外壳程序应将其解释为行继续。在将输入拆分为令牌之前,应删除<backslash>和<newline>。 §2.3令牌识别: 当io_here标记已被语法识别时(请参见Shell Grammar),紧接在下一个NEWLINE标记之后的一个或多个后续行构成一个或多个here-document的主体,并应根据Here-rule的规则进行解析-文件。 当不处理io_here时,外壳程序应通过将下面的第一个适用规则应用于其输入中的下一个字符,将其输入分解为令牌。... ... 如果当前字符是<反斜杠>,单引号或双引号,并且未加引号,则它将影响到后续字符的引号,直到引号文本的末尾。对引用的规则中所描述的引用。在令牌识别期间,不得实际执行任何替换,并且结果令牌应完全包含输入中出现的字符(<newline>联接除外),且未修改,包括在末尾之间的任何嵌入式或封闭引号或替换运算符。引用文字的内容。 …

2
嵌套的双引号在投票很高的单行代码中
一个具有> 3.5K票数的StackOverflow 答案具有此一类功能,可用于分配给DIR当前bash脚本的目录: DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 我对嵌套的双引号感到困惑。据我所知,以下片段被双引号括起来: "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ...,而=()$( dirname和())右边的其他所有内容均未引用。换句话说,我假设第二,第四和第六个"字符分别“关闭”了第一,第三和第五个"字符。 我知道"${BASH_SOURCE[0]}"实现了双引号,但是其他两对双引号的目的是什么? 另一方面,(尽管获得较高的投票分数)上述片段不正确,那么实现其名义意图的正确方法是什么? (按名义意图,我的意思是:将pwd第一个cd-ing 之后的返回值收集到由返回的目录中dirname "${BASH_SOURCE[0]}",并cd在子外壳中执行-ing,以便$PWD父外壳的保持不变。)


1
引用$(command $ arg)的正确方法是什么?
现在是解决困扰我多年的难题的时候了... 我不时遇到这个问题,并认为这是要走的路: $(comm "$(arg)") 并且认为我的观点得到了经验的大力支持。但是我不太确定了。Shellcheck也无法下定决心。两者都是: "$(dirname $0)"/stop.bash ^-- SC2086: Double quote to prevent globbing and word splitting. 和: $(dirname "$0")/stop.bash ^-- SC2046: Quote this to prevent word splitting. 背后的逻辑是什么? (这是Shellcheck 0.4.4版,顺便说一句。)

3
有什么理由使用或教导“…”替代新的开发?
据我了解,由于较容易且不易出错的嵌套和转义语法,更现代的$(...)命令替换语法比`基于旧的语法更可取。 此外,/bin/sh现代使用的大多数样式的shell 似乎都支持$(…): 重击 灰(因此是BusyBox,因此是大多数嵌入式Linux) 短跑 FreeBSD / bin / sh 而$(…)由IEEE 1003.1规定。 所以我有两个非常相关的问题: 除非您知道该脚本需要在特定的旧系统上运行,否则是否有理由在新的Shell脚本开发中使用`? 是否有任何理由不教UNIX编程专业的学生仅仅编写$(...)和讨论,而只是讨论`他们在阅读其他开发人员的shell脚本时可能会遇到的过时变体(如果使用的是真正的旧系统或非标准系统,则可能需要这样做)因为某些原因)?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.