関数を書く

関数を書く

誰かが存在しないコマンドを呼び出すとしましょう。後で実行するスクリプトでそのエラー状態を取得する唯一の方法は、次の方法を使用することです。source

つまり、スクリプトの名前がdummyそのコンテンツの場所にあると仮定します。

#!/bin/bash

echo $?

呼び出すと、私が探している(127)終了ステータスのみを取得できることがわかりますが、これを使用せずにスクリプト内の最後のコマンドから終了ステータスを取得するのにsource dummy役立つ可能性がある他の方法はありますか?私が望む動作を得るために単に電話をかけることはできますか?aliassourcedummy

前のコマンドのタイプミスを確認するスクリプトを作成したいと思います。これを行うには、最初に潜在的なミスがあるかどうかを確認するために前の終了ステータスを検出する必要があるため、スクリプトは最後のコマンドの終了ステータスを取得できる必要があります。また、ユーザーが実行する必要がある設定の量を最小限に抑えて、ユーザーが電話をかけただけで、残りの部分をdummy知って処理するようにしたいと思います。だから私はsource「または」.や「または」を避けようとしますalias

最後のコマンドの終了状態の初期テストは、以下を使用することでした。

#!/bin/bash
ESTATUS=$? # Saved exit status for later
echo $ESTATUS

しかし、これを行うには、またはをsource使用せずに複製するための良い方法はありますか?source.

答え1

このスクリプトを使用することもできますhttps://github.com/rcaloras/bash-preexec(議論https://superuser.com/questions/175799/does-bash-have-a-hook-that-is-run-before-executing-a-command)precmd()関数を使用して$?

答え2

これが何につながるのかよくわかりませんが、次のようにできます。

alias dummy='sh dummy $?'
the_program_with_errors
dummy

スクリプトdummyには以下が含まれます。

echo $1

別の方法はaliasシェル関数を使用することです。

function dummy { sh dummy $? ;}

この定義を使用すると、次の動作を取得できます(およびサブシェルプロセスを使用してエミュレートされますtruefalse

$ true 
$ dummy
0
$ false
$ dummy
1
$ (exit 42)
$ dummy    
42

答え3

あなたが呼び出すスクリプトは、あなたが望む応答を提供する必要があるようです。コマンドをテストし、これらのスクリプトで特定の終了コードを使用する方法は次のとおりです。

#!/bin/bash

# Test for the existence of a command in the path.
command=typo_command
if [[ ! $(command -v $command) ]]; then
    echo "$command does not exist"
    exit 127 # or the code you choose
fi

答え4

関数を書く

シェルはプロセスで、値は$?。あなたのスクリプトは別のサブプロセスですそれ自体の価値がある$?

$?自分に属するシェルを確認するには、シェルプロセスでコマンドを実行する必要があります。source1つの方法ですが、より簡単な方法は関数を書くことです。

function dummy(){
  echo $?
}

ユーザーまたは同等の項目として宣言されている場合は、期待どおりに使用可能で.bashrc動作する必要があります。

(必要に応じて値を渡すことで、他の目的を実行するためにスクリプトを呼び出すこともできます$?。)

関連情報