redirectioinオペレーターを使用してコマンドに提供されているパラメーターを確認するにはどうすればよいですか?


9

これは機能します:

$ echo "通知-送信HELLO" | 今は

これはしません:

$現在<echo "notify-send HELLO"

「ファイルまたはディレクトリが見つかりません」と表示されます。

-fこのコマンドにオプションがあることを理解しています。このオプションを使用して、特定の瞬間に実行するファイルを指定できます。

だから、私は考えさせられました...一般的に、リダイレクトオペレーターが値を提供するパラメーターをどのようにして知ることができますか?


5
あなたの質問はあまり明確ではありません。「どのパラメーター」とはどういう意味ですか。あなたの問題はおそらくあなたが(間違って)それfoo | barbar < foo同等だと思っていることです。ではない。
terdon 2014

回答:


16

ここでは2つの異なるものを使用しており、3番目のものを使用する必要があります。どれどれ:

  1. |:これはパイプ演算子であり、あるプロセスの出力を別のプロセスへの入力として渡すのに役立ちます。

    foo | bar

    これにより、プログラムが実行され、fooその出力がプログラムへの入力として渡されますbar

  2. ><>>および<<:これらはリダイレクト演算子、彼らはから/にデータを送信するのに役立つファイル

    • foo > bar:プログラムを実行fooし、その出力を保存し、ファイル bar上書き1つの、その内容を、それが存在しない場合は、それを作成します。

    • foo >> bar:プログラムfooを実行し、その出力をファイルに保存して bar、その内容に追加し、存在しない場合は作成します。

    • foo < bar:実行fooし、ファイル から入力を読み取るように指示しますbar

    • これ<<は特殊なケースです。コマンドへの「追加」入力には意味がない<<ため、ここは主に(排他的にAFAIK)ヒアドキュメントに使用されます。

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      構文<< SomeStringHere > Out.fileは、終了文字列(EOF上記の例)に到達するまで書き込まれたすべてのテキストをターゲットファイルにリダイレクトします。ここでドキュメントを使用すると、複数行の文字列を簡単にフォーマットし、変数や特殊文字を含めることができます。

  3. <<<オペレータ、ここで文字列は、ここではドキュメントのようなものですが、それは変数が展開されます。したがって、たとえば:

    grep foo <<< "$bar"

    上記のコマンドはと同等echo "$bar" | grep fooです。

  4. 実際に探しているのはプロセス置換と呼ばれ、コマンドの出力を別の方法に渡すもう1つの方法です。それはで構成されてい<(command)ます。

    foo <(bar) 

    したがって、あなたのat例では、あなたがすることができます

    at now < <(echo "notify-send HELLO")

    上記が機能するのは、プロセス置換が実際にファイルを作成し(詳細については上記のリンクを参照)、に渡されるのはそのファイルのファイル記述子だ<からat nowです。


1デフォルトの動作は上書きです。これは、noclobberオプションをbashに設定することで変更できます。設定されているecho foo > bar場合、bar存在すると失敗します。その場合は、echo foo |> bar代わりに使用することができます。セクション3.6.2を参照してくださいここに


1
いい答えだ!非常に徹底的(特にファイルリダイレクタ間の違いを含む)
steeldriver

おかげで、shucks、AWW @steeldriver :)そしてそうだったこれを高く評価宝石の下に。私はあなたの解決策が黙って回避するさまざまな落とし穴のそれぞれに対して+1をあなたに与えることができたらよかったのに。
terdon 2014

<<and に関するいくつかの情報を含めるように拡張してもらえますか<<<(@steeldriverが彼の回答で言及しました)。さらに、もっとあります>>>>>><<<<<<<<<<
Aditya 2014

@Aditya完了。そして心配しないでください、それは<<<:) で止まります
terdon 2014

12

この場合、echo "notify-send HELLO"あるプロセスではないファイル-あなたは必要なプロセスの代替ではなく、ファイルのリダイレクトを

at now < <(echo "notify-send HELLO")

コマンドを完全に回避するためにhere文字列を使用することもできechoます

at now <<< "notify-send HELLO"

5
あなたが好きになりがちな種類の質問を見てきたので(私も同じです)、UnixとLinuxにもう少し時間をかける必要があると思います。私たちは...あそこクールなシェルトリックのために生き、死ぬ
terdon

@terdon:perlのゴルファーにとって同じことですか?
シルヴァンピノー2014

1
@SylvainPineauうんうん。まさにその通り :)。真剣に、あなた、スティールドライバー、そして私が楽しんでいるような質問は、あちこちでより一般的です。場所は、コマンドラインのオタクがいっぱいです一部 人は、ばかばかしいほど精通しています。
terdon 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.