[英]bash function or script to execute command in multiple directories
我想擁有將在dir1
和dir2
中的參數中執行命令的命令
測試
# put this in our .bashrc
alias gca="git commit -v -a"
my-exec gca
my-exec gca -m "my commit wrapped in double quotes"
my-exec gca -m "my commit wrapped in double quotes with 'something' in single quotes"
my-exec gca -m 'my commit wrapped in single quotes with "something" in double quotes'
我努力了
my-exec () {
(cd $HOME/dir1 && eval "$@")
(cd $HOME/dir2 && eval "$@")
}
但它不起作用,因為
# working fine
my-exec gca
# executes
# gca -m my commit wrapped in double quotes
# actually
my-exec gca -m "my commit wrapped in double quotes"
# didnt try
my-exec gca -m "my commit wrapped in double quotes with 'something' in single quotes"
# didnt try
my-exec gca -m 'my commit wrapped in single quotes with "something" in double quotes'
UPDATE
也嘗試過
my-exec () {
echo "$@" > /tmp/my-exec
cat /tmp/my-exec
(cd $HOME/dir1 && bash -i /tmp/my-exec)
(cd $HOME/dir2 && bash -i /tmp/my-exec)
}
但是echo "$@"
也不會保留引號
刪除eval
-它將導致許多解析問題,在這種情況下,您不需要它:
my-exec () {
(cd $HOME/dir1 && "$@")
(cd $HOME/dir2 && "$@")
}
您也可能會遇到麻煩,因為gca
是別名,並且它們具有與之相關的另一組解析奇數。 改用一個函數。 但是請確保刪除別名定義,否則它將覆蓋該函數:
unalias gca
gca() {
git commit -v -a "$@"
}
如果確實確實需要將gca
保留為別名而不是函數(為什么?),則需要使用eval
,但是為了避免混淆復雜的參數,您需要重新引用它們。 幸運的是,您可以使用bash printf
的%q
format指令為參數添加合適的引號/轉義:
my-exec () {
(cd $HOME/dir1 && "$(printf '%q ' "$@")")
(cd $HOME/dir2 && "$(printf '%q ' "$@")")
}
但實際上,您應該使用函數而不是別名。 它們具有更簡潔的語法和語義,並且(如我們在此處看到的)在別名沒有的地方工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.