2016-06-10 82 views
1
ssh="ssh [email protected]" 
dumpstructure="mysqldump --compress --default-character-set=utf8 --no-data --quick -u user -p database" 
mysql=$ssh "$dumpstructure" 
$mysql | gzip -c9 | cat > db_structure.sql.gz 

這是在第三行與失敗失敗時:擊命令作爲變量接合以形成單個命令

的mysqldump --compress --default-字符集= UTF8 --no- data --quick -u user -p database:command not found

爲了調試這個特定的錯誤,我簡化了我的actualy腳本。 $ssh$dumpstructure並不總是在真實腳本中連接在一起。

+1

[我試圖把一個命令放在一個變量中,但複雜的情況總是失敗!](http://mywiki.wooledge.org/BashFAQ/050) – chepner

回答

2

Chepner的答案是即將做這樣的事情的最好方法是正確的,但你得到的是錯誤的原因實際上是更基本的。該行:

mysql=$ssh "$dumpstructure" 

沒有做任何你想做的事情。由於$ssh"$dumpstructure"之間的空間不同,它會將其解析爲environmentvar=value command,這意味着它應該執行「mysqldump ...」部分,並將環境變量mysql設置爲ssh [email protected]。但它比這更糟糕,因爲"$dumpstructure"左右的雙引號意味着它不會被拆分爲單詞,因此整個字符串被視爲命令名稱(而不是mysqldump是命令名稱,其餘部分是參數它)。

如果找到了正確的方式去構建命令,將部件粘在一起的正確方法應該是:

mysql="$ssh $dumpstructure" 

......使整個組合的字符串被作爲治療的一部分要分配給mysql的值。但正如我所說,你真的應該使用Chepner的方法。

5

變量是爲了保存數據,而不是命令。使用功能。

mysql() { 
    ssh [email protected] mysqldump --compress --default-character-set=utf8 --nodata --quick -u user -p database 
} 

mysql | gzip -c9 > db_structure.sql.gz 

參數到命令可以存儲在數組中。

# Although mysqldump is the name of a command, it is used here as an 
# argument to ssh, indicating the command to run on a remote host 
args=(mysqldump --compress --default-character-set=utf8 --nodata --quick -u user -p database) 
ssh [email protected] "${args[@]}" | gzip -c9 > db_structure.sql.gz 
+0

正如你所說,變量是爲了容納數據,所以告訴我是命令一種數據?是的,這當然是數據。更重要的是,OP的帖子也被支持,至少在'x86_64-redhat-linux-gnu'的bash'4.2.46'上運行得很好。所以真正的問題不是因爲它不是一個功能。這是別的。我不認爲你的答案是對這個問題負責。爲什麼我們不能幫助OP找出發生了什麼問題而不是提供新的解決方案? –

-1

實際上,變量中的命令也應該可以工作,並且可以是'$ var`或者只是$($var)的形式。如果它說沒有找到命令,那可能是因爲命令可能不在你身上PATH。或者你應該給你指揮的完整路徑。

因此,讓我們放下這個投票並討論這個問題。

真正的問題是mysql=$ssh "$dumpstructure"。這意味着您將使用其他環境mysql=$ssh執行$dumpstructure。所以我們得到的命令沒有發現異常。這實際上是因爲mysqldump位於遠程服務器而不是該主機上,因此找不到此命令是合理的。

從這一點,讓我們看看如何解決這個問題。

OP想從遠程服務器重新執行mysql數據,這意味着要遠程執行$dumpstructure。我們來看第三行mysql=$ssh "$dumpstructure"。現在我們發現這會導致問題。那麼正確的命令是什麼?最簡單的命令應該像mysql="$ssh $dumpstructure",這意味着兩個$ssh$dumpstructure將加入到可變$mysql單個命令行。

最後,讓我們來談談最後一個命令行。我不同意variable are meant to hold data, not command.原因命令也是一種數據。真正的問題是如何正確使用它。

OP的命令也被支持,至少它支持bash 4.2.46

所以,真正的問題是如何用一個變量來保存命令不導入一種新的方法來做到這一點,他們包木窗成一個bash的功能,例如。

那麼,誰能告訴我爲什麼這個答案沒有納入讀者的注意範圍,而是被拒之門外呢?