とを使用することの違いは何ですか?そしてスクリプトを実行してみてください

とを使用することの違いは何ですか?そしてスクリプトを実行してみてください

私はこれをメインシェルとして使用します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 && 式2

True 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

これにより、両方とも同じ出力を生成すると考えることができます。

私の答えはいいえです。最初のものは生成されますが、foo2番目のものは以下を報告します。

... f: command not found

expand_aliasesもっと明確にすると、これが問題の原因ではありません。問題は、次の声明が原因で発生します。

alias f="echo foo"; f

〜するF一度に完了します。シェルはfそれが何であるかを実際には知らないので、パーサーが停止します。

おすすめ記事