私はUnixに初めてアクセスし、パイプがどのように機能するかを理解しようとしています。私はそれを得たと思い、次の例を試しましたが、成功しませんでした。
(base) MacBook-Pro:Code usr$ echo "file.txt ~/.Trash" | mv
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
何が問題なのか知りたいです。
ありがとう、ダニエル
答え1
ㅏ管路つながる標準出力左プロセスの標準入力は右プロセスの標準入力に渡されます。標準出力echo "file.txt ~/.Trash"
に書き込むと、file.txt ~/.Trash
パイプは文字列をmv
読み取ることができます。
ただし、mv
この時点では標準入力からは読み取られません。引用したエラーメッセージが示すように、代わりに少なくとも2つのコマンドライン引数(1つと1つsource
またはtarget
1つ以上のsource
sと1つ)を受け取ることを期待していますdirectory
。何も表示されないと文句を言います
(mv
たとえば、runなどの必要に応じて呼び出しても標準入力を読みませんecho foo | mv source dest
。確認メッセージが表示された場合など、ユーザーと対話する必要がある場合にのみ標準入力を使用します)。
実際、すべてのプログラムが標準入力を読み取るわけではありません。一部のプログラムで標準ストリームを使用する方法は、実際のman
ページで説明されています。それらPOSIXユーティリティ「STDIN」、「STDOUT」、および「STDERR」専用のセクションがありますが、他のバージョンはあまり正式に構成されていないため、内容全体を読む必要があります。
プログラムが標準ストリームを使用する方法に関する規則はありません。質問への回答で述べたように、提案された重複ターゲット、主にプログラムの意味に関連しています。少し簡単にするためにデータストリームを処理するプログラムは標準入力/出力を使用する傾向があり、オペレーティングシステムオブジェクト(ファイル、ディレクトリ、プロセス、ユーザー...)を処理するプログラムはコマンドライン引数のみを使用する傾向があります。があります。
最後に、あなたの質問が提起する特定の問題に達しました。標準入力から読み取る*nixユーティリティーのサブセットのみを使用して読み取ります。注文する。一般的に言えば、インタプリタだけがあります。主にシェル(標準sh
、、、 ...)およびテキスト処理指向ユーティリティ(テキスト処理にbash
限定zsh
されませんが、例:awk
、、、grep
... sed
)だけでなく、計算機(bc
)、そしてもちろん今は思わない他のものもあります。
* nixシステムを管理するように設計されたほとんどのツールは、mv
文字列を一意の要素に解析するようには設計されていません。一般的なタスク分割では、この役割はシェルの役割であり、mv
個々の意味が明確に定義された特定のタスク(引数ベース)を実行するツールを呼び出すシェルです。mv [-f | -i | -n] [-v] source target
この点を説明すると、次のようになります。mv
標準入力で何をすべきかわかりません。mv foo bar
できるない。echo "mv foo bar" | sh
インタプリタがファイル引数を受け取らない場合は、sh
標準入力からコマンドを読み取り、それを解析してから、mv
2つの引数とを使用foo
して呼び出しますbar
。