bashの複雑なエイリアスの戻り値は何ですか?


2

一連のコマンドのエイリアスであるコマンドを実行すると、どの値がシェルに返されますか?また、次のように定義されたエイリアスがあると仮定します。

alias doit 'cd ~/some/dir; ./my_app; cd -'

./my_appエイリアス化されたコマンド全体の戻り値を返す戻り値を作成するにはどうすればよいですか?

回答:


4

エイリアスは、ほとんどテキストの代替です。したがって、エイリアス定義の後、タイピングdoitはタイピングと同等cd ~/some/dir; ./my_app; cd -です。これはコマンドの構文的に正しいリストであり、その戻り値はシーケンスの最後のコマンドの戻り値ですcd -

他の回答は、中間コマンドのステータスを保存して返す一般的な方法を示しています。ただし、この特定のケースでは、この一連のアクションを表現するより良い方法があります。別のディレクトリに変更してから元に戻す代わりに、サブシェル内の異なる現在のディレクトリを必要とするアクションを実行して、シェルはまったく変わりません。

doit () {
  (cd ~/some/dir && ./my_app "$@")
}

さらに2つの改善を加えました。

  • コマンドが失敗した場合に実行を試行しないように、コマンド間では&&なく使用します。;my_appcd
  • 引数が渡されることを許可my_app:あなたが実行した場合doit foo barmy_app二つの引数で呼び出されるfoobar

すばらしい回答、ありがとう!1つの質問:これがサブシェルで実行される原因は何ですか?それは括弧内のコマンドのラッピングですか、それともシェル関数で実行されているという事実ですか?
ヘビー

@heavyd:括弧はサブシェルの構文です。シェル関数のコードはそのコンテキストから分離されていないため、たとえばcd関数で実行して呼び出し元に影響を与えることができます。
ジル

1

返される値は、最後に実行されたコマンドの終了ステータスです。

代わりに関数を使用する必要があります。

関数doit
{
    cd〜/ some / dir
    ./my_app
    ローカルX = $?
    cd-
    $ Xを返す
}

からman Bash

$? Expands to the status of the most recently executed foreground pipeline.

注:このlocalコマンドは、(同じ名前の)グローバル変数が変更されないようにします。


0

シェルのコードブロックは通常、ブロック内の最後のコマンドの戻り値を返します。あなたの場合、それはになりcd -、失敗することはほとんどありません。

そのエイリアスをシェル関数に変えることで、あなたが望むものを手に入れることができると思います:

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.