一般に、bash コマンドを相互に使用したり (つまり、複合コマンド)、変数と一緒に使用したりすると、かなり混乱します。期待どおりに機能するものは何もありません。コマンドはさまざまな入力タイプを想定しており (たとえば、echo は文字列を受け取り、find はファイル名を受け取ります)、あるコマンドから別のコマンドに情報を転送する方法は多数あります (例: xargs、パイピング、here-strings ( <<<
)、およびコマンド展開 ( $(command)
))。コマンドを相互に使用する場合、あるコマンドから別のコマンドに情報を渡す正しい方法がわからないため、期待どおりに機能します。
いくつかの例: もしそうならecho $VAR
、それは変数が文字列であることを期待します。grep pattern $VAR
すると、変数が文字列ではなくパス名であることが期待されます。grep を取得して文字列として表示するには、私がしなければならないecho $VAR | grep pattern
. したがって、同じ予想される読み取り値を取得するには、コマンドごとに異なる方法で情報を入力する必要があります。
別の例: 私は最近、自分の$PATH
. を使用してできることを理解するには、長い試行錯誤が必要でしたls $(sed 's/:/ /g' <<< "$PATH") | grep searchstring
。引数を にパイプできなかったので、stdin から引数を読み取ることができるls
ようですが、できないのでしょうか?grep
ls
具体的には、次のような質問にお答えください。
- どのコマンドがどのタイプの入力を期待しているかを知るにはどうすればよいですか?
- コマンド (またはフレーズ) 間で情報を渡すさまざまな方法の効果的で意味的な違いは何ですか?
- リダイレクトされた入力と出力は、ここで役に立ちますか?
- 入力の種類を変更するにはどうすればよいですか (たとえば、ファイル名を期待しているが、代わりに文字列を入力したい場合)
- 複合コマンドが解析されるルールは何ですか?
- おまけ: 上記の方法のどこで、どのように bash 展開などを使用できますか (たとえば、情報をパイプした後に bash 展開できますか)?