对多个命令重复使用相似的标志

pol*_*lym 5 shell bash variable

假设我想执行多个具有类似标志的命令,例如:

du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
Run Code Online (Sandbox Code Playgroud)

我想重用标志序列--exclude并使代码更干净,例如将这些标志保存到变量中。

所以之后上面的命令看起来像

du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
Run Code Online (Sandbox Code Playgroud)

请注意,tar排除相对于给定目录的文件和目录。

最好、最干净的解决方案是什么?

背景

我想使用 tar 备份我的系统并排除一些我不需要的目录。

cuo*_*glm 4

你可以试试这个:

$ 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
Run Code Online (Sandbox Code Playgroud)

这里我们使用bash历史扩展:

  • !!参考最后一条命令
  • 3-$参考第三个参数到最后一个

bash您应该在脚本中打开历史扩展功能,该功能在非交互式 shell 中被禁用:

set -o history
set -o histexpand
Run Code Online (Sandbox Code Playgroud)