Bash 再帰呼び出しが失敗する

Bash 再帰呼び出しが失敗する

./bashrc環境変数、コマンドなどを切り替える関数を作成中です。関数は必要な変数を設定してから自分自身を呼び出す必要があります。代わりに私は得る

bash: ./bash: No such file or directory

私のスクリプトの機能.bashrcは次のとおりです。

switch() {
    EXISTS="$(ls ~/br/*$1 2> /dev/null)"
    if [ -z "EXISTS" ]; then
        BR="$1*"
        export PS1="...."
    else
        # Find "export BRANCH=" in .bashrc and replace it with input
        sed -i "0,/export/BRANCH=/{s/export BRANCH=.*$/export BRANCH\"$1\"/}" ~/.bashrc

        ./$0
    fi
}

この投稿を見ると、再帰的にスクリプトを呼び出すしかし、問題が同じかどうかはわかりません。

編集する

私の目標は、基本的に環境変数、エイリアスなどを変更することです。したがって、私のbashスクリプトには最初に次のものが含まれます。

export WORKNAME="br-190"
export BRANCH="~/$WORKNAME"
export WORKSPACE="~/workspace-${WORKNAME}"

alias sw='cd $BRANCH/source'
alias fix='mv ~/.good-files $WORKSPACE'

switch() {
   ... See Above ...
}

目標は、WORKNAMEコマンドラインで変更を実行することです。

switch br-104

ベストアンサー1

最初の明らかな質問は次のとおりです。

if [ -z "EXISTS" ]; then

そうだろういつも確認しているので本当ですひも EXISTS空いた。文字列なので空にできません。あなたはこれをしたいと思います:

if [ -z "$EXISTS" ]; then

lsまた、この種の仕事には悪い習慣であり、スクリプト変数名に大文字を使用するのも悪い習慣です。名前が重複しないようにするには、環境変数にのみ大文字を使用してください。

次の主な問題は通話中です./$0$0それがbashすべてです./$0./bash存在しません。おそらくあなたが望むものはもう一度読むだけです.bashrc

もちろん、sed構文エラーを修正した後でも、コマンドは常に独自に一致します。実際のsedコマンドを使用して行をスキップする必要があります。たとえば、行の先頭でのみ一致します(修正も参照してください)。

sed -i "/^export BRANCH=/{s/export BRANCH=.*$/export BRANCH="$1\"/}" ~/.bashrc

ただし、次のように単純化できます。

sed -i "s/^export BRANCH=.*$/export BRANCH="$1\"/" ~/.bashrc

これをまとめると、おそらく次のようなものが欲しいでしょう。

switch() {
  shopt -s nullglob
  exists=(~/br/*"$1")
  if [ -z "$exists" ]; then
    ## Are you sure you want the * there? That will expand to all
    ## files and directories beginning with $1
    BR="$1*"
    export PS1="...."
  else
    # Find "export BRANCH"a"
    sed -i "s/export BRANCH=.*$/export BRANCH=\"$1\"/" ~/.bashrc
    . ~/.bashrc
    fi
}

おすすめ記事