web-dev-qa-db-ja.com

Bashコマンド置換が期待どおりに機能しない

ファイルの最後の数行を表示したいのですが、列を揃えたいのですが。基本的に、ワードラップを無効にします。

これは簡単です:

tail $FILE | cut -c -80

しかし、私は自分のスクリプトを他のユーザー向けに一般化しようとしているので、実際の端末の幅にカットしたいと思います。

stty size | cut -d" " -f2

だから私はただできると想像します

tail $FILE | cut -c -`stty size | cut -d" " -f2`

しかし、それは機能しません:

stty: standard input: Invalid argument
cut: invalid range with no endpoint: -
Try `cut --help' for more information.

(「新しい」$()展開でも同じ結果になります。)

今、私がそれをエコーすると、それは問題ないようです:

echo cut -c -`stty size | cut -d" " -f2`
cut -c -103

エスケープ文字がないだけですか?それとも、これはどういうわけか不可能ですか?

ありがとう。

4
Joe Fruchey

それが機能しない理由は、sttyがパイプ内で実行されるためです。したがって、基盤となる端末を「認識」しません。スクリプトでは、端末の幅を次のような変数に格納できます。

size=`stty size | cut -d" " -f2`

次にそれを使用します:

tail $FILE | cut -c -$size
3
Jaap Eldering

Bashは、パイプラインで使用できるCOLUMNS変数で画面幅を維持します。

tail $FILE | cut -c -$COLUMNS
1
Bradd Szonye