我有一個特定的命令,根據當前工作目錄的內容作出不同的反應。 我現在希望將這個程序重新傳回給自己,回到不同的目錄中。我可以在命令之間管道,並從不同的目錄運行程序嗎?
在「僞慶典」,我想
command arg1 | cd /other dir | command arg2
我個人使用bash,但如果它有助於使用不同的殼,我很開放的建議。 :)
我知道有一個非常簡單的臨時文件或命名管道解決方法,但我想知道是否有一種方法可以在一個命令中執行此操作。
我有一個特定的命令,根據當前工作目錄的內容作出不同的反應。 我現在希望將這個程序重新傳回給自己,回到不同的目錄中。我可以在命令之間管道,並從不同的目錄運行程序嗎?
在「僞慶典」,我想
command arg1 | cd /other dir | command arg2
我個人使用bash,但如果它有助於使用不同的殼,我很開放的建議。 :)
我知道有一個非常簡單的臨時文件或命名管道解決方法,但我想知道是否有一種方法可以在一個命令中執行此操作。
command arg1 | (cd /other_dir ; command arg2)
(…)
在子shell執行命令。 cd
是一個shell命令,而不是一個「真實的過程」。 (cd X ; command)
將啓動一個新的子shell,cd進入X,然後運行command
。 command
作爲進程運行,但在不同的目錄中。
往前看,最好有可以將目錄作爲參數的命令(如果未定義,則默認爲當前工作目錄)。那麼你可以有簡單的解決方案command arg1 | command --dir=/other_dir arg2
如何使用子shell,是這樣的:
command arg1 | (cd /other/dir; command arg2)
管道不工作的方式。它們只是一種將數據流(而非上下文)從一個命令傳遞到另一個命令的方式。正如@JoachimPileborg指出的那樣,如果您需要管道中的命令在其他上下文中運行,則只需更改該subshell中的目錄即可。
在* nix shell中解決此問題的規範方法是將相關目錄作爲參數傳遞給腳本。你的命令序列如下:
command arg1 .
command arg2 /other/dir
如果你不介意改變當前shell的cwd,你不需要產生一個子shell:'command1 | {cd/other/dir && command2; } - 注意大括號內需要尾隨的分號。 – 2012-02-22 15:37:54
@glenn有沒有任何shell在執行時會實際改變目錄?即使使用{},Bash也會在子進程中運行管道的每個命令。 – 2012-02-22 16:37:04
@WilliamPursell,我無法對其他貝殼說話。雖然好點。 – 2012-02-22 19:29:14