2016-11-04 36 views
1

我設計了一個自定義腳本來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 
+1

僅供參考,你有一些不好的做法,甚至在你的榜樣。未加引號的擴展可能會產生不希望的副作用(例如,如果IFS = /,請嘗試您的現有代碼),並且全大寫變量名[由POSIX指定](http://pubs.opengroup.org/onlinepubs/009695399/) basedefs/xbd_chap08.html)用於表示系統和shell的變量,而至少包含一個小寫字符的名稱保留給應用程序使用。 (請參閱鏈接後面的第四段)。 –

+0

@CharlesDuffy - 感謝您指出全部大寫和無引號擴展的問題。我會記下這些問題並進行更正。回想起來,我對於不清理這個問題確實感到一絲不苟。 –

+0

@CharlesDuffy - 擴展安全的正確方法是什麼?我通過雙引號擴展名來禁用*,?和[]的特殊含義。 –

回答

2

如果你是舒適與分配的副作用上tempfile以前沒有一個非空值條件,這是通過${var:=value}擴展簡單:

cat "$HOME/.bash_history" >"${tempfile:=$(mktemp)}" 
+0

看起來''tempfile'變量的輸出重定向發生在'mktemp'命令的文件分配之前,並留下一個空的(截斷的)文件。 –

+1

事件不可行:'mktemp'在將文件寫入標準輸出之前創建文件並關閉它的標準輸出流;直到它不再是一個打開的流之後才能被讀取,所以'$(mktemp)'不能完成評估,直到文件已存在 –

+1

這就是說,所以我可以在實踐中看到行爲 - 您正在測試哪個版本的bash?並且正如我在介紹性段落中指出的那樣,*確保'tempfile'在代碼運行時未被設置或設置爲零字節的字符串 - 如果它已經存在,它將保持不變,所以你確實會有一個泄漏的空臨時文件被遺留。 –

0

我想有更多的而不是一種方式來做到這一點。我發現下面是工作對我來說:

cat myfile.txt > $(echo "$(mktemp)") 

而且不要忘了tee

cat myfile.txt | tee "$(mktemp)" > /dev/null 
+1

'cat myfile.txt> $(echo「$(mktemp)」)''已經超過'cat myfile.txt>「$(mktemp)」''有什麼好處?此外,這是缺少問題的「存儲在變量」組件。 –

相關問題