在bash中:
echo "*" #Globbing is never done
echo "$variable" # Variable expansion is always done
echo "$(command)" # command expansion is always done
Run Code Online (Sandbox Code Playgroud)
echo '*' #Globbing is never done
echo '$variable' # Variable expansion is never done
echo '$(command)' # command expansion is never done
Run Code Online (Sandbox Code Playgroud)
echo * #Globbing always done.
echo $variable; # Variable expansion is always done
echo $(command) # command expansion is always done
Run Code Online (Sandbox Code Playgroud)
这适用于所有命令吗?
看来您正在寻找例外情况,我猜您已经想到了一些例外情况。我将假设set -f/set -o noglob被排除在本案之外?
当您使用该dd命令时,即使不加引号,也不会发生通配符。
$ ls *.txt\nblah.txt file1.txt file2.txt file.txt logfile.txt\n$ dd if=*.txt of=glob.txt\ndd: failed to open \xe2\x80\x98*.txt\xe2\x80\x99: No such file or directory\nRun Code Online (Sandbox Code Playgroud)\n\n反驳和误报
\n\n下面是一些奇怪的例子,但遵循扩展
\n\nvariable=\'2010-09-08 12:34:56\'\necho "$variable" | xargs date +%s -d\ndate: extra operand \'12:34:56\'
额外的操作数表明正在发生变量扩展,您正在丢失管道中的引号。\n$ date +%s -d 2010-09-08 12:34:56\ndate: extra operand \xe2\x80\x9812:34:56\xe2\x80\x99
echo $1如果您创建一个脚本,然后在传递时扩展引用的变量,也会发生这种情况。它会扩展并按预期工作。因此,问题不在于 xargs,而在于管道之前的扩展,这是正常的。
bash -c,但它需要一个参数。所以,再次强调,这不是扩展问题,而是命令使用问题。cmd=\'printf "%s\\n" "$(date -d "$variable" +%c)"\'\nbash -c $cmd
与扩展版本的工作方式相同
\n\n$ bash -c printf "%s\\n" "$(date -d "$variable" +%c)"\nprintf: usage: printf [-v var] format [arguments]\n
我真的很喜欢 Hauri 的 $\'...\' 和 $"..." 信息 - 然而,这些与我们谈论的不是同一件事。事实上,它们的行为正如 bash 手册页所说的那样。$\'\' 与 \'\' 的区别就像 (()) 与 $(()) 的区别一样
我对此感到很兴奋,所以...\n$ ls\nmclark.txt qt sign_in.txt skel.bash\n$ zip m*t.zip *t\n$ ls *.zip\nm*t.zip
然而,这也不正确——splat 扩展了,但在没有匹配的情况下 zip 将其用作文字。我发现了一些执行此操作的命令,但如果存在匹配项(我稍后添加了 my.zip),它将使用匹配的扩展(引发错误,b/c my.zip 是用于测试目的的文本文件)。
\n| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |