嵌入式shell不支持重定向:exec 2> >(logger -t myscript)

时间:2015-03-03 22:32:53

标签: linux shell

我正在尝试从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。

2 个答案:

答案 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;在这种情况下,foologger -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。