簡體   English   中英

bash函數或腳本以在多個目錄中執行命令

[英]bash function or script to execute command in multiple directories

我想擁有將在dir1dir2中的參數中執行命令的命令

測試

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM