Первая и очевидная проблема заключается в следующем:
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
}