rha*_*der 8 bash pipe process file-descriptor substitution
当我尝试在bash函数中引用两个进程替换管道时,只有引用的第一个管道工作.第二个给出一个"错误的文件描述符"错误,如下所示:
$ foo(){
> cat "$1"
> cat "$2"
> }
$ foo <(echo hi) <(echo bye)
hi
cat: /dev/fd/62: Bad file descriptor
$
Run Code Online (Sandbox Code Playgroud)
看来第二个管道在被引用时被丢弃,但是a)我似乎无法在任何文档中确认这种行为,并且b)我希望它不会.=)
关于我做错了什么的任何想法?FWIW我这样做是为了使包装器使用Mac OS X的FileMerge图形差异工具而不是命令行1,它已经很高兴从命令行使用多个管道.
-抢
首先,我认为@Michael Krelin认为这与OS X(v3.2.48)提供的bash版本有关.它看起来像我的测试,好像文件描述符在函数执行的第一个外部命令后被丢弃:
$ bar() { echo "Args: $*"; echo "First ext command:"; ls /dev/fd; echo "Second ext command:"; ls /dev/fd; }
$ bar <(echo hi) <(echo bye)
Args: /dev/fd/63 /dev/fd/62
First ext command:
0 1 2 3 4 5 6 62 63
Second ext command:
0 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
请注意,/ dev/fd/62和63在两个ls列表之间消失.我想我找到了一个解决方法:在他们有机会消失之前,将脆弱的fd复制到非脆弱的fd:
$ baz() { exec 3<"$1" 4<"$2"; ls /dev/fd; ls /dev/fd; cat /dev/fd/3; cat /dev/fd/4; }
$ baz <(echo hi) <(echo bye)
0 1 2 3 4 5 6 62 63
0 1 2 3 4 5 6
hi
bye
Run Code Online (Sandbox Code Playgroud)
您确定您正在使用 bash 而不是其他 shell 来运行它吗?你检查过 的输出吗echo $SHELL?
使用 bash 对我来说效果很好:
[16:03:51][tim@tim(1)]:~
(0)$function foo() { cat "$1"; cat "$2"; };
[16:03:59][tim@tim(1)]:~
(0)$foo <(echo "lva") <(echo hi)
lva
hi
Run Code Online (Sandbox Code Playgroud)
例如,当我将 shebang 更改为 #!/bin/dash 时,我会收到错误。
请尝试将 #!/bin/bash 作为 shebang 放在脚本的第一行。
| 归档时间: |
|
| 查看次数: |
1518 次 |
| 最近记录: |