我正在尝试从this question运行命令:
exec 2> >(logger -t myscript)
它在我的桌面Linux系统上运行良好,但是,在我的嵌入式linux设备上,相同的命令会出现以下错误:
-sh: syntax error near unexpected token `>'
所以我猜我的shell不喜欢命令语法的一部分 - 很可能是这部分:
exec 2>
的> (logger -t myscript)
事实上,虽然我理解2>
重定向stderr
我实际上并不理解第二个>
字符在这种情况下的语法,它是另一种表示方式吗?管道?
如果我能理解它在做什么,那么也许我可以修改我的命令以在嵌入式linux设备上使用我的有限shell。
答案 0 :(得分:4)
有问题的语法仅适用于bash(或其他具有ksh扩展名的shell)。在错误中
-sh: syntax error near unexpected token `>'
...您正在尝试将该语法与/bin/sh
一起使用。
确保您的脚本以#!/bin/bash
开头,并且您使用bash yourscript
而不是sh yourscript
调用该脚本。
更多解释:
>(foo)
被替换为文件名(如果支持,则为/dev/fd/##
形式,否则为命名管道),其接收来自名为foo
的进程的输出。 这是需要bash或ksh扩展名的部分。 exec <redirection>
将重定向应用于当前shell进程(因此,exec 2>stderr.log
将所有stderr从当前命令及其子项重定向到文件stderr.log
。)。因此,exec 2> >(foo)
修改stderr文件描述符(当前shell会话)转到命令foo
的stdin;在这种情况下,foo
是logger -t myscript
,因此将进程的stderr发送到syslog。
在更有限(但仍然符合POSIX)的shell上执行相同的操作:
# note: if any security concerns exist, put the FIFO in a directory
# created by mktemp -d rather than hardcoding its name
mkfifo /tmp/log.fifo # create the FIFO
logger -t myscript </tmp/log.fifo & # start the reader in the background first!
exec 2>/tmp/log.fifo # then start writing
rm -f /tmp/log.fifo # safe to delete at this point
答案 1 :(得分:1)
>( command )
是一个名为“进程替换”的bash结构。 man bash
说:
支持命名管道(FIFO)的系统或命名打开文件的
/dev/fd
方法支持进程替换。
无论如何,你的shell似乎不是bash。