-1

一般に、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ようですが、できないのでしょうか?grepls

具体的には、次のような質問にお答えください。

  1. どのコマンドがどのタイプの入力を期待しているかを知るにはどうすればよいですか?
  2. コマンド (またはフレーズ) 間で情報を渡すさまざまな方法の効果的で意味的な違いは何ですか?
  3. リダイレクトされた入力と出力は、ここで役に立ちますか?
  4. 入力の種類を変更するにはどうすればよいですか (たとえば、ファイル名を期待しているが、代わりに文字列を入力したい場合)
  5. 複合コマンドが解析されるルールは何ですか?
  6. おまけ: 上記の方法のどこで、どのように bash 展開などを使用できますか (たとえば、情報をパイプした後に bash 展開できますか)?
4

2 に答える 2

2

厄介なことではありませんが、コマンドを学習するには、読書とプレイの時間を費やす必要があります。間違ったコードを書いて修正すればするほど、より多くのことを学ぶことができます。

そこには多くのbashチュートリアルがあります。1 つに移動し、ハッキングを開始します。UNIX コマンドと bash を学習するための魔法の万能薬はありません。Windows と同様に、インターフェイスとコマンドを使用する必要があります。

于 2013-03-05T03:54:55.767 に答える
1

どのコマンドがどのタイプの入力を期待しているかを知るにはどうすればよいですか?

コマンドのマニュアルページを見ると、期待される引数と、そのコマンドが stdin を読み取るかどうかなどを確認できます。

コマンド (またはフレーズ) 間で情報を渡すさまざまな方法の効果的で意味的な違いは何ですか?

コマンドや状況によって異なります。場合によっては、ファイルまたは標準入力 ( grep など-f) を介してテキストを提供するオプションがあり、それはあなたの呼び出しです。

リダイレクトされた入力と出力は、ここで役に立ちますか?

はい

入力の種類を変更するにはどうすればよいですか (たとえば、ファイル名が必要であるが、代わりに文字列を入力したい場合)

文字列から標準入力までは を使用しますがecho $string、他の方法では を使用しますxargs

複合コマンドが解析されるルールは何ですか?

IMO の明確な質問ではありませんが、コマンド自体によって適用されるルールと、現在の問題によるいくつかの設定があります。

おまけ: 上記の方法のどこで、どのように bash 展開などを使用できますか (たとえば、情報をパイプした後に bash 展開できますか)?

あなたはbashで何でもできます:)しかし、パイプ入力での拡張には、いくつかevalの派手なものが必要です。

于 2013-03-05T03:58:33.523 に答える