Questions tagged «command-substitution»

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

5
使用生成的文件名列表作为参数列表-带空格
我正在尝试使用收集的文件名列表调用脚本find。没什么特别的,只是这样: $ myscript `find . -name something.txt` 问题在于某些路径名包含空格,因此在参数扩展时它们会分解为两个无效的名称。通常,我会在名称两边加上引号,但是在这里,它们会由反引号扩展插入。我试过find用引号过滤每个文件名的输出并用引号引起来,但是当bash看到它们时,剥离它们已经为时已晚,它们被视为文件名的一部分: $ myscript `find . -name something.txt | sed 's/.*/"&"/'` No such file or directory: '"./somedir/something.txt"' 是的,这是处理命令行的规则,但是如何解决呢? 这很尴尬,但我没有提出正确的方法。我终于想出了解决方法,但是xargs -0 -n 10000...我仍然想问这个丑陋的hack:我该如何引用反引号扩展的结果,或者以其他方式实现相同的效果? 编辑:我对xargs 确实将所有参数收集到一个参数列表中的事实感到困惑,除非被告知否则可能会超出系统限制。感谢大家使我挺直!其他人,在阅读已接受的答案时,请记住这一点,因为它不是很直接地指出。 我已经接受了答案,但我的问题仍然存在:是否存在某种方法来保护反引号(或$(...))扩展中的空间?(请注意,可接受的解决方案是非强制性的答案)。

7
为什么echo和cat的执行时间会有这样的差异?
回答这个问题使我又问了一个问题: 我认为以下脚本可以做同样的事情,第二个脚本应该更快,因为第一个脚本cat需要一遍又一遍地打开文件,而第二个脚本仅可以打开文件一次然后回显一个变量: (请参阅更新部分以获取正确的代码。) 第一: #!/bin/sh for j in seq 10; do cat input done >> output 第二: #!/bin/sh i=`cat input` for j in seq 10; do echo $i done >> output 而输入约为50兆字节。 但是当我尝试第二个时,它太慢了,因为回显变量i是一个巨大的过程。第二个脚本也有一些问题,例如输出文件的大小比预期的要小。 我还检查了的手册页echo并cat进行比较: 回声-显示一行文本 cat-连接文件并在标准输出上打印 但是我没有区别。 所以: 为什么第二个脚本中的cat这么快而echo这么慢? 还是变量问题i?(因为在手册页中 echo据说它显示“一行文本”,所以我猜它仅针对短变量进行了优化,而不是针对非常长的变量进行了优化i。但是,这只是一个猜测。) 为什么使用时会出问题echo? 更新 我用seq 10而不是`seq 10`不正确。这是编辑的代码: 第一: #!/bin/sh for j …


3
使用“ -o errtrace”(即,设置-E)捕获命令替换中的错误
根据此参考手册: -E(也为-o errtrace) 如果设置,则ERR函数上的任何陷阱都将被Shell函数,命令替换以及在子Shell环境中执行的命令继承。在这种情况下,通常不会继承ERR陷阱。 但是,我必须错误地解​​释它,因为以下操作不起作用: #!/usr/bin/env bash # -*- bash -*- set -e -o pipefail -o errtrace -o functrace function boom { echo "err status: $?" exit $? } trap boom ERR echo $( made up name ) echo " ! should not be reached ! " 我已经知道简单的赋值,my_var=$(made_up_name)将使用set -e(即errexit)退出脚本。 是 …

5
列表中的grep文件
我正在尝试对几百个文件的列表运行grep: $ head -n 3 <(cat files.txt) admin.php ajax/accept.php ajax/add_note.php 但是,即使我在文件中找到我知道的字符串时,它们也不会搜索文件: $ grep -i 'foo' <(cat files.txt) $ grep -i 'foo' admin.php The foo was found 我对从文件-f读取模式的标志很熟悉。但是如何读取输入文件? 我曾考虑过将文件复制到cp似乎支持该<(cat files.txt)格式的临时目录的可怕方法,然后从那里复制文件。雪莉有更好的方法。

2
子外壳中的嵌套引号
说我必须使用引号来封装subshel​​l输出,例如: DATA="$(cat file.hex | xxd -r)" 但是我需要嵌套这样的东西: DATA="$(cat file.hex | xxd -r | tr -d \"$(cat trim.txt)\")" 我不能使用单引号,因为它们不会展开其中的变量。转义引号不起作用,因为它们仅被视为被动文本。 我该如何处理?

1
ksh93如何避免命令替换中的派生
给定 cmd='fun(){ echo "$@"; }; fun $(fun $(fun hi))' 炮弹往往需要制作两个叉子才能实现 strace-f(){ strace -f "$@" 2>&1; }; for sh in dash bash zsh ksh; do printf "$sh\t" ; strace-f $sh -c "$cmd" |grep -e clone -e fork -c; done 除了ksh英勇地使它不分叉一次: dash 2 bash 2 zsh 2 ksh 0 它是如何做到的? 编辑: 插入管道的情况如下: …

3
多变量循环
有没有一种方法可以在for循环中指定多个变量(不仅仅是整数)bash?我可能有2个文件,其中包含我需要使用的任意文本。 我在功能上需要的是这样的: for i in $(cat file1) and j in $(cat file2); do command $i $j; done 有任何想法吗?

3
如何通过命令替换生成另一个命令的参数
从以下内容开始: Shell命令替换中的意外行为 我有一个命令,可以接收大量参数,其中一些参数可以合法地包含空格(可能还有其他内容) 我写了一个脚本,可以为我生成带引号的参数,但是我必须复制并粘贴输出,例如 ./somecommand <output on stdout with quoting> ./othercommand some_args <output from above> 我试图通过简单地简化 ./othercommand $(./somecommand) 并遇到了上面提到的意外行为。问题是-可以可靠地使用命令替换生成参数,othercommand前提是某些参数需要引用并且不能更改?

4
了解Bash的读取文件命令替代
我试图了解Bash如何正确对待以下行: $(< "$FILE") 根据Bash手册页,这等效于: $(cat "$FILE") 我可以遵循第二行的推理路线。Bash在上执行变量扩展$FILE,输入命令替换,将$FILEto 的值传递cat,cat将其内容$FILE输出到标准输出,命令替换通过用内部命令产生的标准输出替换整行来完成,Bash尝试像执行一个简单的命令。 但是,对于我上面提到的第一行,我的理解是:Bash在上执行变量替换$FILE,Bash打开$FILE以读取标准输入,以某种方式将标准输入复制到标准输出,命令替换完成,并且Bash尝试执行生成的标准输出。 有人可以向我解释$FILEstdin到stdout 的内容如何吗?

2
分配类似于具有退出状态的命令,除了何时有命令替换?
请参阅以下示例及其在POSIX Shell中的输出: false;echo $?或false || echo 1:1 false;foo="bar";echo $?或foo="bar" && echo 0:0 foo=$(false);echo $?或foo=$(false) || echo 1:1 foo=$(true);echo $?或foo=$(true) && echo 0:0 正如在/programming/6834487/what-is-the-variable-in-shell-scripting中投票最高的答案所提到的: $? 用于查找最后执行的命令的返回值。 在这种情况下,这可能有点误导,因此让我们获取POSIX定义,该定义也在该线程的帖子中被引用: ?扩展到最新管道的小数退出状态(请参见管道)。 因此,它仿佛是一次分配本身算作一个命令(或者说管道部分)以零退出值,但其应用之前分配的右侧(例如,在我的例子命令替换调用这里)。 我从实际的角度看这种行为是有道理的,但对我而言,分配本身按该顺序进行计数似乎有点不寻常。也许要弄清楚为什么对我来说很奇怪,让我们假设赋值是一个函数: ASSIGNMENT( VARIABLE, VALUE ) 那foo="bar"会是 ASSIGNMENT( "foo", "bar" ) 并且foo=$(false)会像 ASSIGNMENT( "foo", EXECUTE( "false" ) ) 这意味着先EXECUTE运行,然后才运行,但这仍然是重要的状态。 ASSIGNMENTEXECUTE 我的评估是否正确,或者我误会/遗漏了什么?这些是我将这种行为视为“奇怪”的正确原因吗?


3
命令替换可以嵌套在变量替换中吗?
我想在通过命令访问的特定字符串上使用变量替换。例如,如果我将某些内容复制到剪贴板中,则可以这样访问它。 $ xclip -o -selection clipboard Here's a string I just copied. 如果将其分配给变量,则可以对其进行变量替换。 $ var=$(xclip -o -selection clipboard) $ echo $var Here's a string I just copied. $ echo ${var/copi/knott} Here's a string I just knotted. 但是,有没有办法在不将其分配给变量的情况下进行变量替换?从概念上讲,是这样的。 $ echo ${$(xclip -o -selection clipboard)/copi/knott} bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution …

2
if命令在find -exec中
我只是想列出当前目录下的所有目录和文件,并使用以下命令写出它们是文件还是目录: find -exec echo `echo {} : ;if [ -f {} ]; then echo file; else echo directory;fi` \; 我知道这是一个愚蠢的命令,我可以使用诸如-type f或的其他方式-type d,但是我想了解为什么这段代码无法按预期工作。它只是将目录打印到所有这些文件。例如,当输出find为时: . ./dir ./dir/file 我的代码输出是: . : directory ./dir : directory ./dir/file : directory 和输出 echo `echo dir/file : ;if [ -f dir/file ]; then echo file; else echo …

1
为什么在引用子shell并将结果传递给echo的末尾没有换行?
当我做ls | grep pnggrep的输出是: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (文件名,换行符,文件名,换行符) 然后,echo $(ls | grep png)输出: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (文件名,分词时的空格,文件名,换行!从echo开始!) 没关系,但是当我这样做以防止单词split:时echo "$(ls | grep png)",输出为: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png 我的问题是,第二个换行符在哪里(一个应该来自grep,另一个应该来自echo)?

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.