誰がオンラインであるかを示す who
コマンドを使用し、パイプを使用して最初と最後の2人のオンラインユーザーを表示する必要があります。私が知っている唯一の方法は次のとおりです。
who | head -5 | tail -2
。
しかし、これはうまくいきません。
答え1
まっすぐ:
who | head -2
who | tail -2
答え2
次に使用tee
してリダイレクトできます。stderr
who | tee >(head -n2 1>&2 ) | tail -n2
ここでは、実際にファイルをコマンドに置き換え、出力をtee
(経由で)リダイレクトし、すべてがコマンドにパイプ処理されて処理されるため、結果もバイパスする必要があります。しかし、それでも端末に独自に印刷されます。stdin
stdout
head
stdout
stderr
1>&2
stout
tail
tail
head
stderr
コメントディスカッションに基づいて更新されました
Stéphaneが指摘したように、head
SIGPIPEシグナルを送信してパイプラインを早期に終了して、tail
入力ストリームの実際の終わりが表示されないことがあります。
これを防ぐために、下記のようにSIGPIPE信号を無視することができます。ここ、trap
空のコマンドでaを使用します。テスト対象はbash
次のとおりです。
who | { trap "" PIPE ; tee >( head -n 2 3>&1 >&2 ) ; } | tail -n 2
また、コメントでも言及されています。bash
シェルでない場合、結果の順序が混乱する可能性があります。 Stéphaneが提案したソリューションをご覧ください。
答え3
tail
コマンドを使用しようとするとエラーが発生します。実際には、who
コマンド出力から必要なものを抽出するために使用するのではなく、head
コマンドから目的のものを抽出するために使用します。
head
パイプを使用して結合する必要がある場合は、tail
次のことができます。
(who |head -n5 && who |tail -n2)
必要に応じて番号を編集してください。