Выполнить две команды с одним аргументом (без скриптинга)

Выполнить две команды с одним аргументом (без скриптинга)

Как выполнить две команды на одном вводе, не вводя этот ввод дважды?

Например, команда stat многое говорит о файле, но не указывает его тип:

stat fileName

Команда file сообщает тип файла:

file fileName

Вы можете выполнить это в одну строку следующим образом:

stat fileName ; file fileName

Однако вам придется ввести имя файла дважды.

Как можно выполнить обе команды на одном и том же входе (не вводя вход или переменную входа дважды)?

В 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и , dashно только в интерактивном режиме. В AT&T ksh это работает только тогда, когда file "$_"находится на другой строке, чем statта.

решение4

Этот ответ похож на пару других:

статимя файла  && файл !#:1

В отличие от других ответов, которые автоматически повторяютпоследнийаргумент из предыдущей команды, эта требует от вас подсчета:

ls-ldимя файла  && файл !#:2

В отличие от некоторых других ответов, этот не требует кавычек:

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

или

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

Связанный контент