
我有一個 shell 腳本,它將是由其他腳本匯入的標頭
其主要目標是禁止使用“*”和“?”作為參數。
我已經嘗試過:
1) 透過 ~/.bash_history 存取腳本呼叫 由於 ~/.bash_history 在使用者會話結束時升級。我使用以下參數修改了〜/.bashrc:shopt -s histappend,PROMPT_COMMAND =“history -a;$PROMPT_COMMAND”,並嘗試了PROMPT_COMMAND =“history -a;history -c;history -r;$PROMPT_COMMAND”。
當我設定此設定時,系統開始在記憶體時間內升級 ~/.bash_history 檔案。因此,理論上,我將能夠獲取用戶使用的最後一個命令(這應該是腳本呼叫)並在其上搜尋「*」。但正如您可能知道的,shell 腳本必須在其第一行中指定shell 解釋器,例如:/bin/bash,因此,每次呼叫腳本時,它都會建立一個新的shell 會話,並且該新會話無權限存取到上一個會話命令歷史記錄: 例如:
~>cat hist.sh
#!/bin/bash
var=$(tail -n 1 /home/$USER/.bash_history) # get the last command
echo $var
~>./hist.sh
cat hist.sh # that's the output, it shoud be ./hist.sh
我認為 ~/.bash_history 檔案是在命令過程完成時寫入的,這就是 ./hist.sh 不存在的原因,但這只是我的猜測。
2)我還嘗試使用歷史記錄和 fc -l -n -0 命令(目前在 AIX 環境中工作),但我在 Linux 中遇到了相同的問題。
3)我最後一次嘗試是以下腳本:
#!/bin/bash
for i in $@
do
if echo $i | grep '*' &> /dev/null
then echo "Invalid parameter *" && exit
else echo "Sucessful"
fi
done
當我使用 ./script.sh 檔案*(““ + 單字或”" + 單字),但當我單獨使用「*」(./script.sh *)時,它不會,因為 shell 將 * 擴展到 if 語句之前的目前目錄的所有檔案。
我考慮過限制腳本的參數數量,但由於它將成為對許多其他腳本有用的標頭,因此每次調用的參數數量肯定是未知的。
有人可以幫忙解決這個問題嗎?我將非常感激!