Вы должны убедиться, что смена каталога происходит в текущей оболочке, используя его (обратите внимание на .
до $HOME
):
function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }
Это встроенная оболочка, из [ 114]:
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
Обратите внимание, что это делает сценарий railsnewapp.sh выполненным в текущей оболочке, переменные, определенные в сценарии оболочки, будут доступны оболочке после ее завершения.
Почему бы просто не сделать все это в этой функции? Что-то вроде:
rnew() {
local appdir="$HOME/code/$1"
mkdir "$appdir" || return
echo "rvm use 1.8.7@$1" > "$appdir/.rvmrc"
(cd "$appdir" && rvm gemset create "$1") || return
rails new "$1" -m "$HOME/code/config/base_template.rb" -T -J || return
cd "$appdir" && git init .
}
Другой вариант: ваш скрипт напечатает имя каталога в конце скрипта.
...
echo "$appdirectory"
exit
При любых условиях ошибки выведите сообщение об ошибке в stderr (echo something >&2
) и выйдите с ненулевым кодом возврата (exit 1
). В любом случае, это хорошая практика.
Тогда функция может выглядеть так:
rnew () {
local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" )
[[ $? -eq 0 ]] && cd "$dir"
}
$appdirectory
на выход. Я уже сделалcd $appdirectory
(сразу послеrails new...
), но это doesn' t переключаются на тот каталог.. – Alan Burstein 16.11.2019, 11:39.
). Но я вижу теперь, когда добавление продвижения.
работает, спасибо. Теперь пойти чтение некоторые документы для выяснения почему точно! – kuklei 16.11.2019, 11:41cd "$appdirectory"
послеecho $appdirectory already exists. Not creating Rails app $appname.
. – dove 16.11.2019, 11:41