为什么bash数组的一部分作为命令执行?
问题描述:
这个例子已经运行在2017年6月初的Raspbian Jessie 2017-04-10版的Raspberry Pi 3上.Bash的版本是4.3.30(1)。为什么bash数组的一部分作为命令执行?
在最近尝试使用一些代码时,我发现正在执行bash数组的内容。幸运的是,它们并不危险!
这里有一个简单的函数:
#!/bin/bash
echo "y.sh starting"
echo "parameter string is <[email protected]>"
args=([email protected])
echo "args array is <${args[@]}>"
echo "args array length is ${#args[@]}"
echo "y.sh ending"
,这里是输出
[email protected]:~ $ ./y.sh
y.sh starting
parameter string is <>
args array is <>
args array length is 0
y.sh ending
[email protected]:~ $ ./y.sh ls
y.sh starting
parameter string is <ls>
args array is <ls>
args array length is 1
y.sh ending
无意外上方这里。
添加Y *参数之后,ls命令输出出现在阵列中:
[email protected]:~ $ ./y.sh ls y*
y.sh starting
parameter string is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array length is 8
y.sh ending
但被添加时-La,没有的额外信息
[email protected]:~ $ ./y.sh ls -la y*
y.sh starting
parameter string is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array length is 9
y.sh ending
符号如果有人能够解释为什么命令正在执行以及可以进行哪些更改以使其不会执行,这将非常有帮助。为什么ls的“长”输出没有产生,这也是一个解释。
感谢柴郡猫的家乡。
答
您未执行ls -la y*
您将参数传递给y.sh
。首先是ls
,然后-la
那么全局y*
扩展到每个文件成为它自己的参数。
所以你没有执行命令,但glob正在被shell扩展。
这就是运行ls y*
时发生的情况。您实际上并没有将字符串y*
传递到ls
。相反,外壳扩展y*
,并将每个水珠作为参数传递给ls
相匹配的文件,所以你真的运行
ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq
,当你键入
ls y*
你可以看到同样的效果也使用其他命令。例如,echo
将打印它给出的每个参数,因此您可以通过执行echo y*
来模拟ls y*
(尽管echo不会显示任何以y开头的目录的内容)
谢谢。我尝试使用@ runlevel0在这里设置的方法https://stackoverflow.com/questions/12711786/bash-convert-command-line-arguments-into-array,并意识到问题发生之前,功能开始工作参数列表。这指向我http://www.tldp.org/LDP/abs/html/globbingref.html,它扩展了你的解释。情况经常如此,根本原因并不是人们所期望的! – user8150417
由于问题出现在函数外部,所以它不能被函数内部的任何东西修复。 @TaxpayerZombies对这个问题的回应https://ksearch.wordpress。com/2010/09/23/wildcard-expansion-bash-shell /指向正确的方向 - 设置简要禁用通配符的别名。 'alias y ='set -o noglob; yy'; yy(){〜/ y.sh“$ @”; set + o noglob;}' – user8150417