[英]Running multiple commands in one line in shell
說我有一個文件/templates/apple
並且我想要
因此, /templates/apple
將被復制到/templates/used
和/templates/inuse
,然后在此之后,我想刪除原始文件。
cp
是執行此操作的最佳方法,其次是rm
嗎? 或者,還有更好的方法?
我想一行完成所有操作,所以我認為它看起來像:
cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple
這是正確的語法嗎?
您正在使用|
(管道)將命令的輸出定向到另一個命令。 您正在尋找的是&&
運算符,只有前一個命令成功執行才能執行下一個命令:
cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple
要么
cp /templates/apple /templates/used && mv /templates/apple /templates/inuse
總結一下(非詳盡地)bash的命令運算符/分隔符:
|
將一個命令的標准輸出( stdout
)用管道stdout
到另一個命令的標准輸入中。 請注意,無論發生什么情況, stderr
仍會進入其默認目的地。 |&
將一個命令的stdout
和stderr
都stderr
到另一命令的標准輸入中。 非常有用,在bash版本4及更高版本中可用。 &&
執行的右手命令&&
僅在上一個成功。 ||
執行||
的右手命令 只有前一個失敗。 ;
執行的右手命令;
始終不管上一個命令是成功還是失敗。 除非先前曾調用set -e
,否則這將導致bash
因錯誤而失敗。 為什么不先將cp
移至位置1,然后將mv
移至位置2。這需要“刪除”原始文件。
不,這不是正確的語法。 |
用於“管道”一個程序的輸出,並將其轉換為下一個程序的輸入。 你想要的是;
,它分隔多個命令。
cp file1 file2 ; cp file1 file3 ; rm file1
如果您要求單個命令必須在下一個命令啟動之前成功,那么您可以使用&&
代替:
cp file1 file2 && cp file1 file3 && rm file1
這樣,如果任何一個cp
命令失敗,則rm
將不會運行。
注意cp AB; rm A
cp AB; rm A
就是mv AB
。 它也將更快,因為您不必實際復制字節(假設目標位於同一文件系統上),只需重命名文件即可。 所以你想要cp AB; mv AC
cp AB; mv AC
另一個選項是在每個命令的末尾鍵入Ctrl + V Ctrl + J。
示例(用Ctrl + V Ctrl + J替換#
):
$ echo 1#
echo 2#
echo 3
輸出:
1
2
3
無論先前的命令是否失敗,這將執行命令。
與: echo 1; echo 2; echo 3
echo 1; echo 2; echo 3
如果要停止執行失敗的命令,請在每行的末尾添加&&
,最后一行除外。
示例(用Ctrl + V Ctrl + J替換#
):
$ echo 1 &&#
failed-command &&#
echo 2
輸出:
1
failed-command: command not found
在zsh
您也可以使用Alt + Enter或Esc + Enter代替Ctrl + V Ctrl + J
嘗試這個..
cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple
使用管道對我來說很奇怪。 無論如何,您應該使用邏輯and
Bash運算符:
$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples
如果cp
命令失敗,則不會執行rm
。
或者,您可以使用for
循環和cmp
制作更詳細的命令行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.