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

Lon*_*biz 28 command-line

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

例如, stat 命令告诉了很多关于文件的信息,但没有指明它的文件类型:

stat fileName
Run Code Online (Sandbox Code Playgroud)

文件命令,告诉什么类型的文件是:

file fileName
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式在一行中执行此操作:

stat fileName ; file fileName
Run Code Online (Sandbox Code Playgroud)

但是,您必须键入文件名两次。

如何在同一个输入上执行两个命令(无需两次输入输入或输入变量)?

在 Linux 中,我知道如何通过管道传输输出,但是如何通过管道传输输入呢?

iru*_*var 33

可能会让我的指关节为此受到抨击,这里有一个 bash 大括号扩展和 eval 的黑客组合,似乎可以解决问题

eval {stat,file}" fileName;"
Run Code Online (Sandbox Code Playgroud)

  • 对不起,但[我无法抗拒](http://i2.kym-cdn.com/photos/images/newsfeed/000/503/166/bfc.gif)。 (8认同)
  • 大括号扩展起源于`csh`,而不是`bash`。`bash` 从 `ksh` 复制它。该代码适用于所有 csh、tcsh、ksh、zsh、fish 和 bash。 (2认同)

Sté*_*las 29

使用zsh,您可以使用匿名函数:

(){stat $1; file $1} filename
Run Code Online (Sandbox Code Playgroud)

使用eslambda:

@{stat $1; file $1} filename
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

{ stat -; file -;} < filename
Run Code Online (Sandbox Code Playgroud)

(做第stat一个file将更新访问时间)。

我会做:

f=filename; stat "$f"; file "$f"
Run Code Online (Sandbox Code Playgroud)

不过,这就是变量的用途。

  • `{ $COMMAND_A -; $COMMAND_B; 如果 $COMMAND_A 实际读取任何输入,&lt; filename` 变体在一般情况下将不起作用;例如`{猫 -; 猫 -; &lt; filename` 将只打印 filename 的内容一次。 (4认同)
  • `{统计-; file -;} &lt; filename` 很神奇。`stat` 必须检查其标准输入是否连接到文件并报告文件的属性?大概不会在 stdin 上推进指针,因此允许 `file` 嗅探 stdin 内容 (3认同)
  • `stat -` 是从 coreutils-8.0(2009 年 10 月)开始专门处理的,在之前的版本中你会得到一个错误(除非你有一个来自先前实验的名为 `-` 的文件,在这种情况下你会得到错误结果...) (2认同)

cuo*_*glm 24

这是另一种方式:

$ stat filename && file "$_"
Run Code Online (Sandbox Code Playgroud)

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

这适用于bashzsh。这也适用于mksh并且dash仅适用于交互式。在 AT&T ksh 中,这仅在 与file "$_"另一行位于不同的行时才有效stat


god*_*eek 10

在我看来,所有这些答案或多或少都像是在编写脚本。对于真正不涉及脚本的解决方案,并假设您坐在键盘前输入 shell,您可以尝试:

stat somefileEnter
文件Esc_   Enter

至少在 bash、zsh 和 ksh 中,在 vi 和 emacs 模式下,按 Escape 然后下划线会将上一行的最后一个单词插入到当前行的编辑缓冲区中。

或者,您可以使用历史替换:

统计一些Enter
文件文件!$Enter

在 bash、zsh、csh、tcsh 和大多数其他 shell 中,!$当解析当前命令行时,将替换为前一个命令行的最后一个字。