Как изменить каталог в конце скрипта bash?

Вы можете использовать утилиту AWK:

awk 'FNR==1{print ""}{print}' *files > newfile

Источник: https://stackoverflow.com/questions/1653063/how-do-i-include-a-blank-line- между-файлами-им-конкатенации-с-кошки

0
задан 16.11.2019, 11:39

3 ответа

Вы должны убедиться, что смена каталога происходит в текущей оболочке, используя его (обратите внимание на . до $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 выполненным в текущей оболочке, переменные, определенные в сценарии оболочки, будут доступны оболочке после ее завершения.

0
ответ дан 16.11.2019, 11:39
  • 1
    Сценарий работает как ожидалось, это просто doesn' t переключаются на $appdirectory на выход. Я уже сделал cd $appdirectory (сразу после rails new...), но это doesn' t переключаются на тот каталог.. – Alan Burstein 16.11.2019, 11:39
  • 2
    I' ve обновил мой вопрос с полным сценарием. Как я могу запустить его путем определения источника, когда каталог еще не существует? – Abhishek Gupta 16.11.2019, 11:40
  • 3
    Никакие ошибки, это просто doesn' t работа (w/o .). Но я вижу теперь, когда добавление продвижения . работает, спасибо. Теперь пойти чтение некоторые документы для выяснения почему точно! – kuklei 16.11.2019, 11:41
  • 4
    @Zabba: That' s проблема в сценарии, не получая. Определение источника средств, что сценарий был бы выполнен, как будто Вы ввели его в свою оболочку непосредственно. I' m не уверенный, что you' ре, пытающееся достигнуть, но если Вы хотите к CD в каталог, если это уже существует, просто добавляет cd "$appdirectory" после echo $appdirectory already exists. Not creating Rails app $appname.. – dove 16.11.2019, 11:41
  • 5
    @Zabba: какие-либо ошибки? Это работает на меня. – PoloSoares 16.11.2019, 11:41

Почему бы просто не сделать все это в этой функции? Что-то вроде:

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 .
}
0
ответ дан 16.11.2019, 11:40

Другой вариант: ваш скрипт напечатает имя каталога в конце скрипта.

...
echo "$appdirectory"
exit

При любых условиях ошибки выведите сообщение об ошибке в stderr (echo something >&2) и выйдите с ненулевым кодом возврата (exit 1). В любом случае, это хорошая практика.

Тогда функция может выглядеть так:

rnew () { 
    local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" )
    [[ $? -eq 0 ]] && cd "$dir" 
}
0
ответ дан 16.11.2019, 11:40

Теги

Похожие вопросы