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

隐藏bash脚本';在Mac终端中显示当前正在运行的进程时的内容,bash,macos,terminal,Bash,Macos,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

我有一些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
)
这两种方法都可能避免在
ps
列表中出现
while
命令

针对问题更新: 问题仍然是,如果使用
sh-c
(或
bash-c
)执行脚本文本,则该脚本文本是命令行的一部分,可以通过
ps
显示。解决方案也是一样的:通过输入而不是通过命令行选项将脚本提供给she 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
#/usr/bin/env bash

nohup“$BASH”>>~/test.txt 2>&1感谢您提供了这么好的详细答案。我忘了补充说,即使在关闭终端应用程序之后,我也需要运行这个脚本,因此是has
nohup&sh。。。。完成'&
。这就是为什么它是一个单独外壳中的命令。这太不酷了,@Claude。在你得到答案后,以实质性的方式改变问题是不礼貌的。好吧,@Claude,我已经写了一份附录,说明你对问题的修改。