「;」を使用して2つのエイリアスを呼び出すことができないのはなぜですか?

「;」を使用して2つのエイリアスを呼び出すことができないのはなぜですか?

;文字を使用してls; cd2つの一般的なコマンドを結合しようとすると、うまくいきます。ただし、2つのエイリアス(stopdevおよび)を作成し、startdevそれらを組み合わせようとすると、次のようになります。

stopdev; startdev

または、次の後にセミコロンを追加しようとしても、次のようになります。

stopdev;

構文エラーが発生します。

bash:予期しない表示";"近くに構文エラーがあります。

以下を使用すると同じ問題が発生します&&

stopdev && startdev

bash:予期しないマーカー "&&"の近くに構文エラーがあります。

私は別名が他のコマンドと同じだと思ったので、これについて混乱しています。しかし、明らかにそうではありません。

したがって、2つの質問があります。

  1. ;エイリアスを使用して呼び出すのはなぜ&&有効ではありませんか?
  2. stopstartdev2つのコマンドを同時に簡単に実行する方法(エイリアスを作成することに加えて)はありますか?

これは次の定義ですstopdev

alias stopdev="cd $HOME/website; make website_stop; make backend_stop;"

答え1

単にエイリアスをその定義に置き換えてエイリアスを拡張します(文字列ではなくトークンのリストで、これはデフォルトで文字列を取得して末尾にスペースを追加するのと同じです)。だからstopdev; trueそれは次に拡張されます。

cd $HOME/website; make website_stop; make backend_stop; ; true
                                                      ^^^

シェル構文には2つの連続したセミコロンを使用できないため、これは構文エラーです。

を削除する;とうまくいくかもしれませんが、渡すすべての引数がに渡されるのでstopdev; startev良いことはありません。これはおそらく望ましくないでしょう。stopdevmake backend_stop

関数に置き換える必要があります。またmake、失敗した場合はコマンドを実行しないでくださいcd

stopdev () {
  cd "$HOME/website" && {
    make website_stop
    make backend_stop
  }
}

改善点はmake website_stop失敗しましたが、成功しても関数にmake backend_stop失敗コードを返すことです。

stopdev () {
  cd "$HOME/website" && {
    make website_stop
    ret=$?
    make backend_stop && return $ret
  }
}

~/websiteこれにより、ディレクトリにそのまま残ります。シェルプロセスのディレクトリを変更したくない場合は、サブシェルで関数を実行します。

stopdev () (
  cd "$HOME/website" && {
    make website_stop
    ret=$?
    make backend_stop && return $ret
  }
)

あるいは、GNU makeを介してその-Cオプションを使用することもできます。

stopdev () {
  make -C "$HOME/website" website_stop
  ret=$?
  make -C "$HOME/website" backend_stop && return $ret
}

目標が絶対に失敗することができない場合は、両方を通過してください。

stopdev () (
  cd "$HOME/website" && make website_stop backend_stop
)

または

stopdev () {
  make -C "$HOME/website" website_stop backend_stop
}

関連情報