在bash中:
echo "*" #Globbing is never done
echo "$variable" # Variable expansion is always done
echo "$(command)" # command expansion is always done
echo '*' #Globbing is never done
echo '$variable' # Variable expansion is never done
echo '$(command)' # command expansion is never done
echo * #Globbing always done.
echo $variable; # Variable expansion is always done
echo $(command) # command expansion is always done
这将适用于所有命令吗?
看起来您正在寻找例外,我想您会想到一些例外。我将假设set -f
/set -o noglob
被排除在这种情况下?
使用该dd
命令时,即使不加引号,也不会发生globbing。
$ ls *.txt
blah.txt file1.txt file2.txt file.txt logfile.txt
$ dd if=*.txt of=glob.txt
dd: failed to open ‘*.txt’: No such file or directory
反驳和误报
这是一些奇怪的例子,但随着扩展
variable='2010-09-08 12:34:56' echo "$variable" | xargs date +%s -d date: extra operand '12:34:56'
额外的操作数表明变量扩展正在发生,您在管道中丢失了引号。 $ date +%s -d 2010-09-08 12:34:56 date: extra operand ‘12:34:56’
如果您创建了一个脚本echo $1
,然后在传递时扩展了引用的变量,也会发生这种情况。它会扩展,并按预期工作。因此,问题不在于xargs,而是与在管道之前的正常扩展有关。
bash -c
,只是需要一个参数。因此,这又不是扩展问题,而是命令使用问题。cmd='printf "%s\n" "$(date -d "$variable" +%c)"' bash -c $cmd
与扩展版本相同
$ bash -c printf "%s\n" "$(date -d "$variable" +%c)" printf: usage: printf [-v var] format [arguments]
我真的很喜欢Hauri的$'...'和$“ ...”信息-但是,这些与我们所说的不一样。实际上,它们的行为如bash手册页所说的那样。$''与''的区别与(())与$(())的区别
我对此感到很兴奋,所以... $ ls mclark.txt qt sign_in.txt skel.bash $ zip m*t.zip *t $ ls *.zip m*t.zip
但是,这也不对,splat会扩展,但是在没有匹配的情况下,zip会将其用作文字。我找到了一些执行此操作的命令,但是如果存在匹配项(稍后添加了my.zip),它将使用匹配的扩展名(抛出错误,b / c my.zip是用于测试目的的文本文件)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句