Execute dois comandos em um argumento (sem script)

Execute dois comandos em um argumento (sem script)

Como posso executar dois comandos em uma entrada, sem digitar essa entrada duas vezes?

Por exemplo, o comando stat diz muito sobre um arquivo, mas não indica seu tipo:

stat fileName

O comando file informa que tipo de arquivo é:

file fileName

Você pode fazer isso em uma linha desta maneira:

stat fileName ; file fileName

No entanto, você deve digitar o fileName duas vezes.

Como você pode executar os dois comandos na mesma entrada (sem digitar a entrada ou uma variável da entrada duas vezes)?

No Linux, eu sei como canalizar saídas, mas como canalizar entradas?

Responder1

Provavelmente vou levar uma pancada nos nós dos dedos por isso, aqui está uma combinação hackeada de expansão e avaliação do bash brace que parece funcionar

eval {stat,file}" fileName;"

Responder2

Com zsh, você pode usar funções anônimas:

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

Com eslambdas:

@{stat $1; file $1} filename

Você também pode fazer:

{ stat -; file -;} < filename

(fazer o statprimeiro fileirá atualizar o tempo de acesso).

Eu faria:

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

porém, é para isso que servem as variáveis.

Responder3

Aqui está outra maneira:

$ stat filename && file "$_"

Exemplo:

$ 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

Isso funciona em bashe zsh. Isso também funciona mkshe dashapenas quando interativo. Na AT&T ksh, isso só funciona quando file "$_"está em uma linha diferente daquela stat.

Responder4

Esta resposta é semelhante a algumas outras:

Estadonome do arquivo  && arquivo !#:1

Ao contrário das outras respostas, que repetem automaticamente odurarargumento do comando anterior, este requer que você conte:

ls -ldnome do arquivo  && arquivo !#:2

Ao contrário de algumas das outras respostas, isso não requer aspas:

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

ou

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

informação relacionada