我正在尝试编写此命令,使其在屏幕上运行,同时使用其他 2 个命令cat
来读取文件,然后将其导入awk
进行过滤。命令如下;
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt | awk '{print $1}' > /var/www/html/filter/first.txt
如果我检查分离的屏幕,我会看到它正在过滤列表,当它完成时,文件first.txt
已创建但为空。我看到了一些关于-L
在屏幕中使用输出日志的内容,但我希望输出进入未过滤列表所在的同一文件夹并调用first.txt
,我无法弄清楚为什么它会成功运行,但输出文件每次都是空的。如果我在没有screen -d -m
创建文件的情况下运行它,则文件不为空。我想我遗漏了屏幕命令的某些内容。我刚开始使用屏幕。我不确定什么时候发布。
答案1
这不起作用的原因是 shell 将命令分成两部分,如下所示:
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt
awk '{print $1}' >/var/www/html/filter/first.txt
screen
在单独的 pty 上运行。cat
然后没有输出标准输出用管道输送到awk
。
如果您想要管道在屏幕下运行,则需要将其与 shell 的另一个实例分组:
screen -d -m bash -c 'cat /var/www/html/filter/unfiltered.txt | awk "{print $1}" >/var/www/html/filter/first.txt'
完成此操作后,应该清楚这是不必要的使用cat
,实际上命令可以简化如下:
screen -d -m bash -c 'awk "{print $1}" </var/www/html/filter/unfiltered.txt >/var/www/html/filter/first.txt'
注意,我已将内部引号从单引号改为双引号。这是因为我使用单引号来保护整个命令(尤其是防止$1
早期评估)。