linux - jobs -l 命令无法使用 csh 写入文件

标签 linux scripting redhat tcsh

我们目前有一个脚本,用于检查是否有东西在后台运行。它通过运行以下命令(已更新以包含我在我们的服务器上运行的完整测试脚本示例)来执行此操作:

#!/bin/csh -f
sleep 30 &
set testFile = /tmp/checkFile$$
jobs -l > $testFile

它在屏幕上打印正在运行的进程,但检查文件中没有任何内容,因此导致服务器认为其他部分未能启动)。完全不知道为什么这不起作用。其他命令似乎工作正常。

我正在运行 rhel 6.8 并以非根用户身份运行命令。 .运行其他命令(例如 ps >/tmp/testFile)没有问题。

在进一步挖掘系统后,添加了以下注释:

  • /bin/csh 是/bin/tcsh 的软链接(soft link)(我删除了 csh 标签)
  • 将 shebang 行更改为/bin/tcsh -f 并没有改变任何东西(显然但想声明)
  • 文件已创建但内容为空

最佳答案

在某些版本的 tcsh 中,jobs -l 命令将其输出打印到 stderr。在其他情况下,它打印到标准输出。 (我会说打印到标准输出是正确的行为。)

解决方法是改变

jobs -l > $testFile # redirect stdout

jobs -l >& $testFile # redirect both stdout and stderr

这对任何版本的 tcsh 都应该能正常工作,无论有没有这个错误。

请注意,OP 系统上的 tcsh 是指向 csh 的符号链接(symbolic link),因此这可能是一个 tcsh 问题。

https://github.com/tcsh-org/tcsh 有一个 tcsh 源的镜像.日志显示 2016-05-24 所做的更改,“不要将作业打印到 stderr (paulo.cesar.pereira.de.andrade)”。查看提交历史,jobs 输出似乎在 tcsh 6.19.01 和 6.20 版本中打印到 stdout,在 6.19.00 及更早版本中打印到 stderr。显然,OP 较新的 RHEL 6.8 系统上的一些软件包已经更新。

我看到 jobs -l 在 tcsh 6.14.00 和 6.18.01 中写入标准输出。这可能是一种倒退。 (我无法从源代码构建 tcsh 6.19 或更早版本。)

关于linux - jobs -l 命令无法使用 csh 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46414671/

相关文章:

用于检索唯一单词并与标点符号一起计数的 Linux 命令

linux - 在 bash 中执行 shell 脚本时如何控制用户定义的命令?

linux - cd 后 umask 设置更改

logging - 记录 HAProxy 自定义 header

linux - RHEL5 上的 CVS 版本

linux - korn shell 脚本失败

linux gst_element_factory_make ("rtspsrc",NULL)在 qt5 上失败

linux - 编辑目录表的内容 (Linux)

python - 使用 Python 脚本切换进程(运行时终止,不运行时启动)

用于删除文件名不在文本文件中的 Shell 脚本