2016-11-09 71 views
0

其實我對bash編程知之甚少。我讀過管道允許我們使用程序的輸出作爲另一個的輸入。然後,我預計一些語句,比如婁作品:如何與bash上的系統調用共享參數?

echo "newdirectory" | (mkdir && cd) 

mkdirecho接收outputed字符串作爲其第一個參數,cd太之後。另一點是管道不能從左邊的進程同步執行(是嗎?)。

有一種方法可以通過bash上的系統調用重用參數嗎?

特別是在這種情況下創建一個新的目錄並改變它。

+1

不是普遍適用的,但您可以在問題的示例中使用'$ _'。 '$ _'擴展爲前一個命令的* last *參數,所以'mkdir「newdirectory」&& cd「$ _」'將是等價的。 – chepner

+0

@chepner雖然nos的答案更加完整和教誨,但您的評論填補了我在尋找的內容。 –

回答

2

您可以爲此使用變量,並將命令行參數傳遞給兩個命令mkdir和cd,而不是嘗試將數據傳輸到這些命令。

MYDIR="newdirectory" 
mkdir "$MYDIR" && cd "$MYDIR" 

有了這個,

echo "newdirectory" | (mkdir && cd) 

您同時連接的mkdir和CD的標準輸入。一個程序/命令需要知道 是否應該從stdin讀取數據,以及如何處理它。 mkdircd命令都沒有這樣做,他們希望你給他們命令行參數。

即使在命令可以從標準輸入讀取數據的情況下,在這種情況下,mkdir會消耗輸入,並且不會爲cd留下任何內容。在其他情況下,如果將相同的管道連接到多個命令/進程,則無法確定其中哪一個會讀取數據。

此外,(mkdir && cd)中的圓括號表示這些命令在子shell中運行。但是cd僅影響當前shell,因此您將無法觀察到cd命令的任何影響。

+0

感謝您的解釋。 –

-1
mkdir `echo NewDirectorName` 

也使用程序的輸出作爲另一個程序的參數。

完成此操作的另一種方法是使用xargs命令。

echo NewDirectoryName | xargs mkdir 

@ nos的回答對你的情況來說是最正確的。

+0

您錯過了OP希望一次指定的值與'mkdir' *和*'cd'一起使用的事實。命令替換在這裏沒有任何用處。 'xargs'用於使用不同的參數多次運行* one *命令,而不運行具有相同參數的* 2 *命令。 – chepner

+0

我說另一個答案是最正確的問題。我的答案僅供參考,因爲它是相關的,語法與OP的代碼示例更類似。 – nategoose