1 つの引数で 2 つのコマンドを実行する (スクリプトなし)

1 つの引数で 2 つのコマンドを実行する (スクリプトなし)

入力を 2 回入力せずに、1 つの入力で 2 つのコマンドを実行するにはどうすればよいですか?

たとえば、stat コマンドはファイルについて多くの情報を提供しますが、ファイルの種類は示しません。

stat fileName

file コマンドは、ファイルの種類を示します。

file fileName

これを 1 行で実行するには、次のようにします。

stat fileName ; file fileName

ただし、fileName を 2 回入力する必要があります。

両方のコマンドを同じ入力で実行するにはどうすればよいですか (入力または入力の変数を 2 回入力せずに)?

Linux では、出力をパイプする方法はわかっていますが、入力をパイプするにはどうすればよいでしょうか?

答え1

おそらくこれでは叱られることになるだろうが、bash の括弧展開と eval を組み合わせたハッキーな方法がうまくいくようだ。

eval {stat,file}" fileName;"

答え2

を使用するとzsh、匿名関数を使用できます。

(){stat $1; file $1} filename

ラムダを使用する場合es:

@{stat $1; file $1} filename

次のようなこともできます:

{ stat -; file -;} < filename

(stat最初に実行するとfileアクセス時間が更新されます)。

私ならこうします:

f=filename; stat "$f"; file "$f"

ただし、変数はそのためにあるのです。

答え3

別の方法は次のとおりです。

$ stat filename && file "$_"

例:

$ stat /usr/bin/yum && file "$_"
  File: ‘/usr/bin/yum’
  Size: 801         Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d  Inode: 1189124     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:rpm_exec_t:s0
Access: 2014-06-11 22:55:53.783586098 +0700
Modify: 2014-05-22 16:49:35.000000000 +0700
Change: 2014-06-11 19:15:30.047017844 +0700
 Birth: -
/usr/bin/yum: Python script, ASCII text executable

bashこれはおよびで動作しますzsh。これは および でも動作しますがmksh、対話型の場合のみです。AT&T ksh では、 がとは異なる行にあるdash場合にのみ動作します。file "$_"stat

答え4

この回答は他のいくつかの回答と似ています:

統計ファイル名  && ファイル !#:1

他の回答では自動的に同じ答えが繰り返されるが、最後前のコマンドの引数とは異なり、このコマンドでは次の数を数える必要があります。

ls -ldファイル名  && ファイル !#:2

他の回答とは異なり、引用符は必要ありません。

stat "useless cat"  &&  file !#:1

または

echo Sometimes a '$cigar' is just a !#:3.

関連情報