./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
}
答え2
インポートすると、.bashrc
実行コマンドが単に呼び出されますbash
。
これは再び次./$0
に拡張されることを意味します。
./bash
ファイルが現在のディレクトリにないため、bash
このエラーメッセージが表示されます。実行したくないのでインポートしたいので、.
ファイル名とファイル名の間にスペースが必要です。それ以外の場合は、.
現在の作業ディレクトリが参照されます。
. ~/.bashrc