對多個命令重複使用相似的標誌

對多個命令重複使用相似的標誌

假設我想執行多個具有類似標誌的命令,例如:

du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4

我想重複使用標誌序列--exclude並使程式碼更乾淨,例如將這些標誌儲存到變數中。

所以之後上面的指令看起來像

du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"

請注意,tar排除相對於給定目錄的檔案和目錄。

最好、最乾淨的解決方案是什麼?

背景

我想使用 tar 備份我的系統並排除一些我不需要的目錄。

答案1

你可以試試這個:

$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4

這裡我們使用bash歷史擴充:

  • !!參考最後一條指令
  • 3-$參考第三個參數到最後一個

bash您應該在腳本中開啟歷史擴充功能,該功能在非互動式 shell 中被停用:

set -o history
set -o histexpand

答案2

在 Bash 中,一個非常簡潔的方法是使用陣列:

myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"

他們可以處理空格和任何其他有趣的字元:

myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"

它們也可以被偽造,例如,您想要排除 目錄 中/this/one包含字母的所有子目錄g

exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"

答案3

我本來會將此添加為評論,但我還沒有弄清楚如何很好地格式化評論!

無論如何,我相信你已經成功了 90%。嘗試:-

EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS

第一行需要引號,因為涉及空格。

使用變數時不加引號,以便在空格上分割參數。

如果排除的目錄名稱中有空格,您需要將其轉義。

相關內容