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

标签 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。

最佳答案

所讨论的语法仅适用于 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)修改(当前 shell session 的)stderr 文件描述符以转到命令 foo 的标准输入;在这种情况下,foologger -t myscript ,从而将进程的标准错误发送到系统日志。


要在更有限(但仍然符合 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

关于linux - 内嵌shell不支持重定向: exec 2>>(logger -t myscript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28843312/

相关文章:

关于 [OPTIONS] 的 Linux man 命令

linux - 在bash中执行带有多个参数的命令

linux - 按特定名称递归查找目录,然后清除它们

Linux - 创建进程

linux - 复制目录时排除目录

c++ - 将有符号转换为无符号,反之亦然

linux - Apache/PHP 内存使用

Python 2.7 将变量传递到子进程命令行

linux - 计时器检查文件末尾 bash shell

linux - 基本的 if else 脚本