对一个参数运行两个命令(无需脚本)

对一个参数运行两个命令(无需脚本)

如何在一个输入上执行两个命令,而无需输入两次该输入?

例如,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

使用eslambda:

@{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

这适用于bashzsh。这也适用于mkshdash但仅在交互时有效。在 AT&T ksh 中,仅当file "$_"与 位于不同线路时才有效stat

答案4

这个答案与其他几个答案类似:

统计数据文件名  && 文件!#:1

与其他答案不同,其他答案会自动重复最后的来自上一个命令的参数,这个命令需要您计算:

LS-LD文件名  && 文件!#:2

与其他一些答案不同,这不需要引号:

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

或者

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

相关内容