通常,我们只需要传递一个参数:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Run Code Online (Sandbox Code Playgroud)
有没有办法传递两个参数?就像是
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Run Code Online (Sandbox Code Playgroud)
我可以先将两个结果存储在一个文件中
echo abc > file1
echo xyz > file2
cat file1 file2
Run Code Online (Sandbox Code Playgroud)
但是我可能会不小心覆盖一个文件,这是不行的。这是进入一个非交互式脚本。基本上,我需要一种方法来将两个任意命令的结果传递给cat而不写入文件。
更新:抱歉,该示例掩盖了问题。虽然{ echo abc ; echo xyz ; } | cat似乎确实有效,但输出是由于echos 而不是cat.
一个更好的例子是{ cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,它不能按预期工作。
和
file1:
a,b …Run Code Online (Sandbox Code Playgroud) bash shell-script pipe command-line-arguments bash-scripting
为什么这不起作用?
ls *.txt | xargs cat > all.txt
Run Code Online (Sandbox Code Playgroud)
(我想将所有文本文件的内容加入一个“all.txt”文件中。) find 与 -exec 也应该可以工作,但我真的很想了解 xargs 语法。
谢谢
有没有办法将Win32 控制台中进程的标准输出重定向到命名管道?命名管道内置于 Windows 中,虽然它们是一个有用的概念,但我从未见过它们从命令行使用。
IE。喜欢example.exe >\\.\mypipe。(此语法可能不正确,但您明白了。)我希望能够同时将stdout和stderr重定向到不同的管道。
我想避免使用物理文件作为替代,以避免处理 IO 缓慢、IO 缓冲区、文件锁、访问权限、可用硬盘空间、决定覆盖、无意义的持久性等。
另一个原因是因为传统的 Windows工具集不像在 Unix 中那样围绕基于(文本)文件的哲学设计。此外,命名管道不能轻易安装在 Windows 中,如果有的话。
最后,好奇一个好的概念是否可以得到很好的使用。
我需要从非 BASH 脚本(即 PHP 脚本)执行许多管道 shell 命令,如下所示:
command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)
所以,如果 command1以非零退出代码失败,则每个其他命令也会失败。到目前为止,我想出的是:
set -o pipefail && command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)
但即使它从终端运行良好,如果从脚本执行它也会产生这个:
sh: 1: set: 非法选项 -o pipefail
这是一个以相反顺序对文件夹中的文件进行排序的命令
ls | sort -r
Run Code Online (Sandbox Code Playgroud)
有什么作用 |该命令符号有?
我在这里真正寻找的是 Linux 初学者对管道的高级(易于理解)解释。我在 Superuser 上看到了有关管道的其他问题,但没有任何答案可以简单地解释它们的作用以及它们与重定向(>或<符号)的区别。
除了方便之外,对文件进行分类并将其通过管道传送到 grep 是否还有其他优势?方便之处在于,当我从历史记录中检索如下命令时,光标位于行尾,因此很容易修改具有不同文本的命令以针对同一文件进行 grep。
那么以下约定还有哪些其他优点:
cat /var/tmp/trace.2043925204.xt | grep -in profile
cat /var/tmp/trace.2043925204.xt | grep -n Profile-Main
Run Code Online (Sandbox Code Playgroud)
代替:
grep -in profile /var/tmp/trace.2043925204.xt
grep -n Profile-Main /var/tmp/trace.2043925204.xt
Run Code Online (Sandbox Code Playgroud) 我想在使用之前测试一个替换,所以我正在尝试编写一个快速的在线命令来查看输出是什么。但是,我不确定语法是什么。我想做的是
cat file | -replace "a", "b"
Run Code Online (Sandbox Code Playgroud)
什么是正确的 powershell 语法?
我知道我也可以做$a = cat file然后在 上进行替换$a,但我想将其保留在一行上
ls(不带参数)的输出似乎用换行符分隔文件名。
证据:
ls | grep foo按预期工作,grep将每个文件名视为单独的输入行。
ls > files.txt; vim files.txt --> 在 Vim 中,每个文件都在单独的一行
然而在终端中,输出ls将多个文件放在一行上,用空格分隔文件名以形成很好对齐的列:
$ ls
a.txt b.txt c.txt
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,ls 如何做到这一点?
是否使用一些特殊的控制字符来“伪造”换行符?或者它是否知道它的输出何时通过管道传输到另一个命令,并在这种情况下以不同的方式格式化输出?
在本教程中,我们需要执行以下命令:
# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Run Code Online (Sandbox Code Playgroud)
-后面的最后一个(连字符)bash是什么意思?
我已经看到了很多与此相关的命令,但找不到合乎逻辑的解释,也找不到如何重新制定谷歌搜索的方法。它是管道命令的输出吗?
pipe ×10
command-line ×5
bash ×4
linux ×4
cat ×2
grep ×1
ls ×1
named-pipe ×1
newlines ×1
powershell ×1
redirection ×1
shell ×1
shell-script ×1
unix ×1
windows ×1
xargs ×1