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

时间:2017-09-25 21:46:11

标签: linux scripting redhat tcsh

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

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

它会在屏幕上显示正在运行的进程,但检查文件中没有任何内容,从而导致服务器认为其他部分无法启动)。完全失去了为什么这不起作用。其他命令似乎工作正常。

我正在运行rhel 6.8并以非root用户身份运行该命令。 。运行ps > /tmp/testFile等其他命令可以顺利运行。

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

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

1 个答案:

答案 0 :(得分:2)

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

解决方法是更改​​

jobs -l > $testFile # redirect stdout

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

这适用于任何版本的tcsh,无论是否有错误。

请注意,OP系统上的tcsh是csh的符号链接,因此这可能是一个特定的tcsh问题。

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

我在tcsh 6.14.00和6.18.01中看到jobs -l写入stdout。这可能是回归。 (我无法从源代码构建tcsh 6.19或更早版本。)