我設計了一個自定義腳本來grep連接列表.bash_history
備份文件。在我的腳本中,我創建了一個臨時文件mktemp
並將其保存到變量temp
。接下來,我使用cat
命令將輸出重定向到該文件。在一個命令中創建臨時文件並將輸出重定向到它
是否有辦法創建一個臨時文件(使用mktemp
),將輸出重定向到它,然後將其存儲在一個命令中的變量中,同時保留換行符?
下面的代碼片段工作得很好,但我有一種感覺,有一個更簡潔和規範的方式來實現這一點 - 可能使用process substitution或類似的東西。
# Concatenate all .bash_history files into a temporary file `temp`.
temp="$(mktemp)"
cat "$HOME/.bash_history."* > $temp
trap 'rm -f $temp' 0
# Set `HISTFILE` shell variable to the `temp` file.
HISTFILE="$temp"
keyword="$1"
# Search for `keyword` using the `history` command
if [[ "$keyword" ]]; then
# Enable history
set -o history
history | grep "$keyword"
# Disable history
set +o history
else
echo -e "usage: search <keyword>"
exit 0
fi
僅供參考,你有一些不好的做法,甚至在你的榜樣。未加引號的擴展可能會產生不希望的副作用(例如,如果IFS = /,請嘗試您的現有代碼),並且全大寫變量名[由POSIX指定](http://pubs.opengroup.org/onlinepubs/009695399/) basedefs/xbd_chap08.html)用於表示系統和shell的變量,而至少包含一個小寫字符的名稱保留給應用程序使用。 (請參閱鏈接後面的第四段)。 –
@CharlesDuffy - 感謝您指出全部大寫和無引號擴展的問題。我會記下這些問題並進行更正。回想起來,我對於不清理這個問題確實感到一絲不苟。 –
@CharlesDuffy - 擴展安全的正確方法是什麼?我通過雙引號擴展名來禁用*,?和[]的特殊含義。 –