3

特定のフォルダーから起動する必要があるサーバーを起動する Bash 関数の作成に取り組んでいますが、このサーバーを起動して現在の作業に影響を与えたくありません。私は次のように書いています。

function startsrv {
        pushd .
        cd ${TRUNK}
        ${SERVERCOMMAND} & 
        popd
}

変数はすべて設定されていますが、これを実行すると、出力に予期しないセミコロンに関するエラーが表示され${SERVERCOMMAND}ます。バックグラウンドで始まるアンパサンドの後に Bash がセミコロンを挿入しているようです。

${SERVERCOMMAND}現在のディレクトリに確実に戻るように pushd と popd を使用しながら、バックグラウンドで開始するためにできることはありますか?

編集:echo ${SERVERCOMMAND}リクエストされたので、の出力:

yeti --server --port 8727

エラーメッセージ:

-bash: syntax error near unexpected token `;'
4

3 に答える 3

11

の値は$SERVERCOMMAND? その中にセミコロンが必要です。

価値があるのは、pushd/cd を 1 つの pushd に単純化することです。

pushd $TRUNK
$SERVERCOMMAND &
popd

または、サブシェルを作成して、cd が 1 つのコマンドのみに影響するようにします。

(cd $TRUNK; $SERVERCOMMAND &)
于 2011-06-09T20:11:53.673 に答える
3

${SERVERCOMMAND}それ自体にバグがない限り、セミコロンによって構文エラーが発生することはありませんbash。セミコロンの問題は、コードの見えない部分にあるはずです。

セミコロンの問題とは別に、コードにはいくつかの小さなバグがあります。

  • ${TRUNK}変数展開は引用されていません。ディレクトリ名に空白が含まれている場合、bashはそれを複数のフィールドに分割してから を呼び出しcdます。
  • の戻り値cd ${TRUNK}はチェックされません。ディレクトリが存在しない場合はbash、現在のディレクトリでサーバーを呼び出します。
  • この関数は、実行に失敗する可能性があるかどうかをテストしません${SERVERCOMMAND}(コマンドが見つからないなど)。
  • functionキーワードとpushdおよびpopdコマンドはbash固有であるため、このコードは POSIX シェルでは実行されません。

これは、より安全な POSIX 互換の書き直しです。

log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$*"; exit 1; }

startsrv() {
    (
        cd "${TRUNK}" || fatal "failed to cd to '${TRUNK}'"
        set -- ${SERVERCOMMAND}
        command -v "$1" >/dev/null || fatal "command '$1' not found"
        command "$@" &
    ) || exit 1
}
于 2011-06-10T19:57:00.830 に答える
3

使用することもできますcd -

cd $TRUNK
$SERVERCOMMAND &
cd -
于 2011-06-09T20:14:38.820 に答える