如何将两个命令的输出合并?

3
我该如何将pwdls的输出连接起来并添加到一个名为f1的文件中?以下方法不可行:
pwd, ls > f1

1
你的意思是“在同一行上”还是“在同一个文件中”? - gniourf_gniourf
3个回答

9

使用复合命令:

{ pwd; ls; } > f1

不会将它们连接成一行。如果这确实是他想要的。 - Etan Reisner
1
其实,当我打字时意识到了你的意思,本来不想评论,但显然我下意识按下了回车键 :) - chepner
有趣的是,在bash中你可以写(pwd;ls),但不能写{pwd;ls;}{pwd;ls}:需要前导空格和尾随分号 - { pwd;ls;} - Vytenis Bivainis
1
由于历史原因,大括号不是控制字符,因此它们既不能终止命令,也不能表示单词的结尾。 - chepner
1
顺便说一下:printf '%s\n' "$PWD" * > f1 - gniourf_gniourf
显示剩余3条评论

1
保存一个分号和两个空格,需要一个进程,相对于@chepner而言成本较高 :-)
(pwd;ls) > f1

1
也许你正在寻找更难的事情,但文件追加是一个简单的解决方案:
pwd >> f1
ls >> f1

如果您更喜欢Chepner或Mark Setchell的答案,这里有一个解释:
  1. You can use subshell with parenthesis:

    ( pwd; ls; ) > f1
    
  2. Or subcommand:

    { pwd; ls; } > f1
    

使用子Shell时,父Shell无法访问子进程的环境变量。因为创建了一个新的孤立进程,变量不会被保留。

而使用子命令初始化变量后,变量将被保留并可用于父Shell。

两者都有父级环境。

参考:


为了与OP的问题等效,您需要使用pwd > f1; ls >> f1,否则如果已经存在文件,则会将其附加到文件中,而原始命令会覆盖任何原始文件。此外,我的命令的重点是省略分号和空格-而您重新引入了它们。而chepner先生的解决方案不是子命令,而是一个复合命令-即由多个部分组成的命令。 - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接