例は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の "長い"出力がなぜ生成されないのかについての説明も興味深いでしょう。
チェシャー猫のおかげで感謝しています。
ありがとうございます。私はhttps://stackoverflow.com/questions/12711786/bash-convert-command-line-arguments-into-arrayで@ runlevel0で設定されたアプローチを試してみたところ、問題が機能が動作を開始する前にパラメータリスト。これはあなたの説明を拡大するhttp://www.tldp.org/LDP/abs/html/globbingref.htmlに私を指摘しました。たいていの場合そうですが、根本的な原因は、誰かが期待するところではありません! – user8150417
問題は関数外でグロビングすると発生しますので、関数内の何かで修正することはできません。この質問に対する@TaxpayerZombiesの応答はhttps://ksearch.wordpressです。com/2010/09/23/wildcard-expansion-bash-shell /正しい方向に指し示す - globbingを一時的に無効にするエイリアスを設定する。 'エイリアスy = 'set -o noglob; yy'; yy(){〜/ y.sh" $ @ "; set + o noglob;}' – user8150417