変数へのコマンドの割り当て

変数へのコマンドの割り当て

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_Filebashは内部文字を通常の文字として扱います。したがって、まず|コマンドラインにはパイプではなくリテラル文字があります。

$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 と同じです。

関連情報