ls
私の変数にコマンドを割り当てましたが、my_File
実行すると$my_File
機能しません。理由を説明できますか?
#!/bin/bash
my_File='ls -f | grep -v '\/''
$my_File
答え1
作成した行は、値がstringの変数を定義しますls -f | grep -v /
。引用符なしで使用すると、単語リスト(スペースで区切られた文字列):、、、、、、、に展開ls
されます。この文字は、シェルが文字列を解析する代わりに分割するため、特別ではないため、コマンドの2番目の引数になります。-f
|
grep
-v
/
|
ls
これらの文字列にはコマンドを入力できません。コマンドの短い名前を定義するには、エイリアス(コマンドが完了した場合)または関数(コマンドにパラメータがあり、一部のデフォルトパラメータを単一のコマンドに渡さない場合)を使用します。あなたの場合は、エイリアスが適しています。
alias my_File='ls -f | grep -v /'
my_File
答え2
$ my_File='ls -f | grep -v '\/''
$ $my_File
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
[snip]
解釈すると、$my_File
bashは内部文字を通常の文字として扱います。したがって、まず|
コマンドラインにはパイプではなくリテラル文字があります。
$my_File
コマンドラインから実行し、パイプラインが機能するようにする場合に必要ですeval $my_File
。
答え3
echo "${var='ls -f | grep -v "\/"'}" |sh
必ずしも通訳は必要ありませんが、必ず通訳が必要です。eval
。
. <<-HEREDOC /dev/stdin
$var
HEREDOC
echo "$var" | . /dev/stdin
そこに行く方法はいくつかあります。
${0#-} -c "$var"
sh - c "$var"
答え4
変数=command
バックティック文字(`)
var = pwd
echo $var = /home/user/foo と同じです。