如何在一个输入上执行两个命令,而无需输入两次该输入?
例如,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
lambda:
@{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.