;
文字を使用してls; cd
2つの一般的なコマンドを結合しようとすると、うまくいきます。ただし、2つのエイリアス(stopdev
および)を作成し、startdev
それらを組み合わせようとすると、次のようになります。
stopdev; startdev
または、次の後にセミコロンを追加しようとしても、次のようになります。
stopdev;
構文エラーが発生します。
bash:予期しない表示";"近くに構文エラーがあります。
以下を使用すると同じ問題が発生します&&
。
stopdev && startdev
bash:予期しないマーカー "&&"の近くに構文エラーがあります。
私は別名が他のコマンドと同じだと思ったので、これについて混乱しています。しかし、明らかにそうではありません。
したがって、2つの質問があります。
;
エイリアスを使用して呼び出すのはなぜ&&
有効ではありませんか?stopstartdev
2つのコマンドを同時に簡単に実行する方法(エイリアスを作成することに加えて)はありますか?
これは次の定義です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
良いことはありません。これはおそらく望ましくないでしょう。stopdev
make 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
}