假设我想将以下命令存储在变量中
cd "/cygdrive/c/Program Files/"
所以我这样做
dir="cd \"/cygdrive/c/Program Files/\""
那应该存储命令以导航到Program Files目录,所以当我键入$ dir时,它将带我到该目录。要检查报价是否已正确转义,我输入
echo $dir
这给了我
cd "/cygdrive/c/Program Files/"
因此,一切都应该正常工作。但是,当我键入时,
$dir
我懂了
bash: cd: "/cygdrive/c/Program: No such file or directory
我究竟做错了什么?我正在使用Cygwin,但我认为此问题通常适用于bash。
简短的答案:请参阅BashFAQ#050(“我试图将命令放入变量中,但是复杂的情况总是会失败!”)。
长答案:当bash解析命令时,它将解析引号,然后替换变量。它永远不会返回并重新解析变量值中的引号,因此它们最终无济于事。使用echo检查命令是完全误导的,因为它在解析命令后会显示该命令。如果您想查看实际执行的内容,请在执行时使用set -x
shell打印命令,或者使用printf "%q " $dir; echo
而不是普通回显。
如果要存储一个复杂的命令(即,在“单词”中带有空格或其他特殊字符的命令),则需要将其放置在数组中,而不是简单的文本变量,然后使用成语“''$ { array [@]}“,如下所示:
dir=(cd "/cygdrive/c/Program Files/")
"${dir[@]}"
现在,如果目的是制作易于键入的速记,显然这不是可行的方法。请改用Shell别名或函数:
alias dir='cd "/cygdrive/c/Program Files/"'
dir
或者
dir() { cd "/cygdrive/c/Program Files/"; }
dir
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句