我们都知道mkfifo和管道。第一个创建了一个命名管道,因此必须选择一个名称,最有可能与mktemp之后记得取消链接。另一个创建了一个匿名管道,没有命名和删除的麻烦,但是管道的末端被绑定到管道中的命令,以某种方式获取文件描述符并在其余部分使用它们并不是很方便的脚本。在编译的程序中,我会这样做ret=pipe(filedes);在 Bash 中有很多exec 5<>file人会期待类似的东西,"exec 5<> -"或者"pipe <5 >6"- 在 Bash 中有类似的东西吗?
这个单命令的 BASH 脚本文件很难理解,所以我想为每个动作写一个注释:
echo 'foo' \
| sed 's/d/a/' \
| sed 's/e/b/' \
| sed 's/f/c/' \
> myfile
Run Code Online (Sandbox Code Playgroud)
(sed 只是一个例子,实际上它是 grep、trs 和 awks 的混合体)
我讨厌不得不重复行,或者让每条评论远离它适用的行。
但同时 BASH 似乎不允许“内嵌”注释。
任何优雅的方法来解决这个问题?
谁能告诉我是否可以管道| 这无需在 A 和 B.tar.gz 之间的任何位置创建物理文件?
这就是我想要做的:
例如:
cp A B | tar cvf - B | gzip -9 B.tar.gz
Run Code Online (Sandbox Code Playgroud) 我试图追踪一些进程的一些奇怪行为,但遇到了一个我不知道如何追踪过去的问题。我附加到使用的挂起进程strace -p显示了这一点:
Process 7926 attached - interrupt to quit
read(3,
Run Code Online (Sandbox Code Playgroud)
好的,所以它正在等待 fd 3 的输入,所以我去检查它是什么:
$ ls -l /proc/7926/fd/3
lr-x------ 1 user grp 64 Mar 15 10:41 /proc/7926/fd/3 -> pipe:[20043922]
Run Code Online (Sandbox Code Playgroud)
好的,所以这是一个烟斗……现在的问题是——这个烟斗的作者是谁?我记得在 Linux 上有一个 unix 域套接字的特殊功能,您可以请求一个以 NUL 字节开头的文件路径来访问“抽象套接字命名空间”(这里提到:http : //tkhanson.net/cgit.cgi /misc.git/plain/unixdomain/Unix_domain_sockets.html)。我不确定我可以利用的管道是否有类似的东西,但我没有找到任何东西。
我希望有一个类似fuser或lsof可能会有所帮助的工具,但我什么也没得到。
有任何想法吗?
是否可以将输出(例如dmesg)通过管道传输到类似less(或等效)的命令并保持原始命令使用的文本突出显示?
例子:左边dmesg | less右边dmesg

有什么办法让文字的着色通过管道传送|到head,tail,less,等?
如何将 ffmpeg 的输出通过管道传输到 ffplay?
目前我在 bash 中使用了一种解决方法:
mkfifo spam
(ffplay spam 2> /dev/null &) ; capture /dev/stdout | ffmpeg -i - spam
Run Code Online (Sandbox Code Playgroud) 假设我想删除目录中除名为“notes.txt”的文件之外的所有文件。我会用管道来做到这一点,ls | grep -v "notes.txt" | xargs rm. 如果第二个管道的输出是 rm 应该使用的输入,为什么我需要 xargs?
为了进行比较,管道echo "#include <knowledge.h>" | cat > foo.c将回显的文本插入到文件中,而不使用 xargs。这两个管道有什么区别?
我有一个 .gz sql 转储文件(例如:foo.sql.gz),我想使用经典的 mysql 命令将其导入到我的数据库中。
gunzip -c foo.sql.gz > foo.sql
mysql -uroot -ppassword foo < foo.sql
Run Code Online (Sandbox Code Playgroud)
foo 是数据库。
如何在一个命令中管理这两个命令?
试过
gunzip -c foo.sql.gz | mysql -uroot -ppassword foo
Run Code Online (Sandbox Code Playgroud)
但似乎不起作用;我明白了gzip: stdout: Broken pipe
我需要在名为 command.bat 的批处理脚本中回显像这样的命令用法
command.bat on|off
Run Code Online (Sandbox Code Playgroud)
我不能用
echo %0 on|off
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用
echo "%0 on|off"
Run Code Online (Sandbox Code Playgroud)
但它把引号放在一起
有没有其他办法?