私はこれをメインシェルとして使用しますbash
が、これは一般的な質問であり、他のシェルへの答えもbash
非常に歓迎します。
インタラクティブに入力する場合
#original line
#wget http://something.com && unzip something && mv -f something /home/poney/
#new line
wget http://something.com ; unzip something ; mv -f something /home/poney/
次の行を含むスクリプトと比較して、実行ヒープ、順序、メモリ、解釈、権限に違いはありますか?
#!/bin/bash
wget http://something.com
unzip something
mv -f something /home/poney/
添付:
スクリプトの実行が3つのコマンドを連続して入力するよりも確かに短いという事実を除いて。
ベストアンサー1
はい、大きな違いがあります。 &&
はい段落そのため、前のコマンドが終了コードを返す場合にのみ、後続のコマンドが実行されます0
。
から引用手動:
式1
&&
式2True if both expression1 and expression2 are true.
一方、スクリプトには次のものが含まれます。
expression1
expression2
最初の式が失敗しても、2番目の式が実行されます。 (と言ってエラー発生時に終了するスクリプトを指定しない限りset -e
)
編集:あなたのコメントに関して以下を確認してください。
command1; command2
同じです:
command1
command2
正解は通常。 Bash は、ステートメントの 1 つを評価する前に、ステートメント全体のブロックを解析します。 A;は前のコマンドを評価しません。前のコマンドが後のコマンドの構文解析方法に影響する場合は、違いがわかります。
alias
エイリアスを含むファイルを考えてみましょう。項目を含むファイルをと呼びます。
alias f="echo foo"
それでは、以下を含むスクリプトを考えてみましょう。
shopt -s expand_aliases
source ./alias
f
別の内容は次のとおりです。
shopt -s expand_aliases; source ./alias; f
これにより、両方とも同じ出力を生成すると考えることができます。
私の答えはいいえです。最初のものは生成されますが、foo
2番目のものは以下を報告します。
... f: command not found
expand_aliases
もっと明確にすると、これが問題の原因ではありません。問題は、次の声明が原因で発生します。
alias f="echo foo"; f
〜するF一度に完了します。シェルはf
それが何であるかを実際には知らないので、パーサーが停止します。