簡體   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