.png)
Как выполнить две команды на одном вводе, не вводя этот ввод дважды?
Например, команда 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.