2017-06-12 10 views
2

例は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の "長い"出力がなぜ生成されないのかについての説明も興味深いでしょう。

チェシャー猫のおかげで感謝しています。

答えて

6

実行していませんls -la y*あなたは引数をy.shに渡しています。最初はls、その後は-laとなり、globy*がそれぞれに展開するすべてのファイルは、それ自身のパラメータになります。

コマンドを実行していないが、globがシェルによって展開されている。

これはls y*でも実行されます。文字列y*を実際にlsに渡すわけではありません。代わりに、シェルはy*や場所、あなたが本当にあなたが

ls y* 

を入力するときは、同じ効果を見ることができました

ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq 

を実行していることと思いますので、lsの引数としてグロブに一致する各ファイルを展開します他のコマンドも使用します。例えば、echoは与えられた各引数を出力しますので、echo y*を実行してls y*をシミュレートできます(echoはyで始まるディレクトリの内容を表示しません)。

+0

ありがとうございます。私はhttps://stackoverflow.com/questions/12711786/bash-convert-command-line-arguments-into-arrayで@ runlevel0で設定されたアプローチを試してみたところ、問題が機能が動作を開始する前にパラメータリスト。これはあなたの説明を拡大するhttp://www.tldp.org/LDP/abs/html/globbingref.htmlに私を指摘しました。たいていの場合そうですが、根本的な原因は、誰かが期待するところではありません! – user8150417

+0

問題は関数外でグロビングすると発生しますので、関数内の何かで修正することはできません。この質問に対する@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

関連する問題