繁体   English   中英

在Mac Terminal中显示当前正在运行的进程时隐藏bash脚本的内容

[英]Hide bash script's content when displaying currently-running processes in Mac Terminal

我有一些bash脚本,它将当前时间戳写入某些文件:

#!/usr/bin/env bash
nohup & sh -c 'while [[ 1 ]];
do
    vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);
    echo $vardate >> ~/test.txt;
    sleep 1;
done' &

当我在所有进程的列表中运行ps -ef ,我可以看到:

...
501 32034     1   0 10:17PM ttys000    0:00.97 sh -c while [[ 1 ]];\012do\012    vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);\012    echo $vardate >> ~/test.txt;\012    sleep 1;\012done
...

是否有可能完全隐藏此PID或至少隐藏脚本的内容?

ps不显示该脚本的内容本身 而是显示正在运行的命令的命令行。 碰巧该命令是由您的脚本启动的,因此出现在其中。

实际上,脚本本身很奇怪。 它已经是一个shell脚本,因此显式启动一个新的单独的shell以在其中运行while循环( sh -c )的目的是什么? 与让脚本直接执行循环相比,我没有任何优势。

例:

#!/usr/bin/env bash
while [[ 1 ]];
do
    vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);
    echo $vardate >> ~/test.txt;
    sleep 1;
done

或者,如果确实有目的的是不要在当前shell中执行循环,那么为什么不使用()运算符在子shell中运行它呢?

范例

#!/usr/bin/env bash
(
  while [[ 1 ]];
  do
    vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);
    echo $vardate >> ~/test.txt;
    sleep 1;
  done
)

两者都可能会避免while命令出现在ps列表中。

针对问题更新:

问题仍然是,如果您使用sh -c (或bash -c )执行脚本文本,则该脚本文本是命令行的一部分,可以通过ps显示。 解决方案也相同:通过脚本的输入而不是通过命令行选项将脚本输入到shell。 您可以使用heredoc将其与nohup和后台执行结合起来:

#!/usr/bin/env bash

nohup "$BASH" >> ~/test.txt 2>&1 <<'EOF' &
while [[ 1 ]]; do
  date +%d\-%m\-%Y\_%H.%M.%S
  sleep 1
done
EOF

这包括与原始版本相比超出必要范围的更改。 这是一个摘要,大致按出现顺序:

  • nohup命令之后,您不需要或不需要& 我已经省略了。
  • 这个版本执行bash而不是sh ,而是通过自动变量$BASH ,该变量扩展为启动当前bash实例的文件名。
  • nohup命令(将启动bash )的全部输出及其stderr都重定向到输出文件( >> ~/test.txt 2>&1 )。 这样可以抑制原本为我显示的诊断,并且比原始文件每秒每秒打开和关闭输出文件更有效。
  • 该命令的输入(实际上是nohup )是从heredoc重定向的,无需当前shell扩展( <<'EOF' ... EOF )。 这是防止脚本内容出现在进程列表中的关键组件。 可能值得注意的是,heredoc内容直到下一行才真正开始,因此它不包含& 这很重要,因为&终止命令(实际上是命令所属的整个管道),因此它不能更早出现。
  • 消除了vardate变量和echo命令,而只允许直接输出date输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM