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

В моем .bashrc:

function rnew { $HOME/.dotfiles/railsnewapp.sh $1; }

По сути, я вызываю rnew из любого каталога, и он создает каталог в ~/code/appname, устанавливает в него Rails, а затем я хочу, чтобы pwd, чтобы стать ~/code/appname.

В ~/.dotfiles/railsnewapp.sh:

#! /bin/bash appname=$1 appdirectory="$HOME/code/$appname" if [ -d $appdirectory ]; then echo $appdirectory already exists. Not creating Rails app $appname. else mkdir $appdirectory cd $appdirectory if [ `pwd` == $appdirectory ]; then echo "rvm use 1.8.7@$appname" >> "$appdirectory/.rvmrc" rvm gemset create $appname cd .. rails new $appname -m $HOME/code/config/base_template.rb -T -J cd $appdirectory if [ `pwd` == $appdirectory ]; then git init . else echo Could not create git repo in $appdirectory. Could not switch to that directory. fi else echo Could not switch to directory $appdirectory. No creating Rails app $appname. fi fi ######## how to switch to $appdirectory here so that ######## when the `rnew` function completes and I'm back at the ######## terminal and the `pwd` is $appdirectory?

Пс. Я не хочу делать cd в rnew. Как вы можете видеть в сценарии, я уверен, что приложение создано в правильном каталоге и других проверках, связанных с каталогом, поэтому я не думаю, что могу вызвать скрипт из rnew для каталога, быть создан?

0
задан 29 April 2011 в 22:54

27 ответов

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $HOME):

function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }

Это встроенная оболочка, начиная с help .:

.: . 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 в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет закончена.

1
ответ дан 25 May 2018 в 21:48
  • 1
    Я обновил свой вопрос с полным скриптом. Как я могу запустить его путем поиска, когда каталог еще не существует? – Zabba 29 April 2011 в 22:51
  • 2
    @Zabba: Это проблема в скрипте, а не в поиске. Sourcing означает, что скрипт будет выполнен, как если бы вы ввели его в свою оболочку напрямую. Я не уверен, чего вы пытаетесь достичь, но если вы хотите записать cd в каталог, если он уже существует, просто добавьте cd "$appdirectory" после echo $appdirectory already exists. Not creating Rails app $appname.. – Lekensteyn 29 April 2011 в 22:56
  • 3
    Скрипт работает так, как ожидалось, он просто не переключается на $appdirectory после выхода. Я уже сделал cd $appdirectory (сразу после rails new...), но он не переключается в этот каталог. – Zabba 29 April 2011 в 22:59
  • 4
    @Zabba: любые ошибки? Меня устраивает. – Lekensteyn 29 April 2011 в 23:04
  • 5
    Нет ошибок, он просто не работает (без .). Но теперь я вижу, что добавление ведущего . работает, спасибо. Теперь, чтобы прочитать некоторые документы, чтобы понять, почему именно! – Zabba 29 April 2011 в 23:05

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $HOME):

function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }

Это встроенная оболочка, начиная с help .:

.: . 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 в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет закончена.

1
ответ дан 25 July 2018 в 22:07

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $HOME):

function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }

Это встроенная оболочка, начиная с help .:

.: . 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 в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет закончена.

1
ответ дан 26 July 2018 в 18:59

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $HOME):

function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }

Это встроенная оболочка, начиная с help .:

.: . 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 в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет закончена.

1
ответ дан 2 August 2018 в 03:37

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $HOME):

function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }

Это встроенная оболочка, начиная с help .:

.: . 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 в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет закончена.

1
ответ дан 4 August 2018 в 19:38

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $ HOME ):

  Функция  rnew {.  $ HOME / .dotfiles / railsnewapp.sh $ 1;  }  

Это встроенная оболочка из справки . :

  .:.  filename [arguments] Выполнить команды из файла в текущей оболочке.  Прочитайте и выполните команды из FILENAME в текущей оболочке.  Записи в $ PATH используются для поиска каталога, содержащего FILENAME.  Если какие-либо АРГУМЕНТЫ поставлены, они становятся позиционными параметрами при выполнении FILENAME.  Exit Status: возвращает статус последней команды, выполненной в FILENAME;  если FILENAME не может быть прочитан.   

Обратите внимание, что это делает скрипт railsnewapp.sh в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет завершена.

1
ответ дан 6 August 2018 в 03:44

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $ HOME ):

  Функция  rnew {.  $ HOME / .dotfiles / railsnewapp.sh $ 1;  }  

Это встроенная оболочка из справки . :

  .:.  filename [arguments] Выполнить команды из файла в текущей оболочке.  Прочитайте и выполните команды из FILENAME в текущей оболочке.  Записи в $ PATH используются для поиска каталога, содержащего FILENAME.  Если какие-либо АРГУМЕНТЫ поставлены, они становятся позиционными параметрами при выполнении FILENAME.  Exit Status: возвращает статус последней команды, выполненной в FILENAME;  если FILENAME не может быть прочитан.   

Обратите внимание, что это делает скрипт railsnewapp.sh в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет завершена.

1
ответ дан 7 August 2018 в 21:38

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $ HOME ):

  Функция  rnew {.  $ HOME / .dotfiles / railsnewapp.sh $ 1;  }  

Это встроенная оболочка из справки . :

  .:.  filename [arguments] Выполнить команды из файла в текущей оболочке.  Прочитайте и выполните команды из FILENAME в текущей оболочке.  Записи в $ PATH используются для поиска каталога, содержащего FILENAME.  Если какие-либо АРГУМЕНТЫ поставлены, они становятся позиционными параметрами при выполнении FILENAME.  Exit Status: возвращает статус последней команды, выполненной в FILENAME;  если FILENAME не может быть прочитан.   

Обратите внимание, что это делает скрипт railsnewapp.sh в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет завершена.

1
ответ дан 10 August 2018 в 09:53

Вы должны убедиться, что изменение каталога происходит в текущей оболочке путем ее поиска (обратите внимание на . перед $ HOME ):

  Функция  rnew {.  $ HOME / .dotfiles / railsnewapp.sh $ 1;  }  

Это встроенная оболочка из справки . :

  .:.  filename [arguments] Выполнить команды из файла в текущей оболочке.  Прочитайте и выполните команды из FILENAME в текущей оболочке.  Записи в $ PATH используются для поиска каталога, содержащего FILENAME.  Если какие-либо АРГУМЕНТЫ поставлены, они становятся позиционными параметрами при выполнении FILENAME.  Exit Status: возвращает статус последней команды, выполненной в FILENAME;  если FILENAME не может быть прочитан.   

Обратите внимание, что это делает скрипт railsnewapp.sh в текущей оболочке, переменные, определенные в shellscript, будут доступны оболочке, когда она будет завершена.

1
ответ дан 13 August 2018 в 16:11
  • 1
    Я обновил свой вопрос с полным скриптом. Как я могу запустить его путем поиска, когда каталог еще не существует? – Zabba 29 April 2011 в 22:51
  • 2
    @Zabba: Это проблема в скрипте, а не в поиске. Sourcing означает, что скрипт будет выполнен, как если бы вы ввели его в свою оболочку напрямую. Я не уверен, чего вы пытаетесь достичь, но если вы хотите записать cd в каталог, если он уже существует, просто добавьте cd & quot; $ appdirectory & quot; после echo $ appdirectory уже существует. Не создавать Rails app $ appname. . – Lekensteyn 29 April 2011 в 22:56
  • 3
    Скрипт работает так, как ожидалось, он просто не переключается на $ appdirectory после выхода. Я уже сделал cd $ appdirectory (сразу после rails new ... ), но он не переключается на этот каталог. – Zabba 29 April 2011 в 22:59
  • 4
    @Zabba: любые ошибки? Меня устраивает. – Lekensteyn 29 April 2011 в 23:04
  • 5
    Нет ошибок, он просто не работает (без . ). Но теперь я вижу, что добавление ведущего . работает, спасибо. Теперь, чтобы прочитать некоторые документы, чтобы понять, почему именно! – Zabba 29 April 2011 в 23:05

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

...
echo "$appdirectory"
exit

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

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

rnew () { 
    local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" )
    [[ $? -eq 0 ]] && cd "$dir" 
}
3
ответ дан 25 May 2018 в 21:48

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

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 .
}
1
ответ дан 25 May 2018 в 21:48

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

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 . }
1
ответ дан 25 July 2018 в 22:07

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

... echo "$appdirectory" exit

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

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

rnew () { local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" ) [[ $? -eq 0 ]] && cd "$dir" }
3
ответ дан 25 July 2018 в 22:07

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

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 . }
1
ответ дан 26 July 2018 в 18:59

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

... echo "$appdirectory" exit

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

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

rnew () { local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" ) [[ $? -eq 0 ]] && cd "$dir" }
3
ответ дан 26 July 2018 в 18:59

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

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 . }
1
ответ дан 2 August 2018 в 03:37

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

... echo "$appdirectory" exit

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

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

rnew () { local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" ) [[ $? -eq 0 ]] && cd "$dir" }
3
ответ дан 2 August 2018 в 03:37

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

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 . }
1
ответ дан 4 August 2018 в 19:38

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

... echo "$appdirectory" exit

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

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

rnew () { local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" ) [[ $? -eq 0 ]] && cd "$dir" }
3
ответ дан 4 August 2018 в 19:38

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

  rnew () {local appdir = "$ HOME / code / $ 1" mkdir "$ appdir" ||  return echo "rvm use 1.8.7@$1" & gt;  «$ appdir / .rvmrc» (cd «$ appdir» & amp; rvm gemset создает «$ 1») ||  return rails new "$ 1" -m "$ HOME / code / config / base_template.rb" -T -J ||  return cd "$ appdir" & amp; & amp; & amp;  git init.  }  
1
ответ дан 6 August 2018 в 03:44

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

  ... echo "$ appdirectory" exit  

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

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

  rnew () {local dir = $ ($ HOME / .dotfiles / railsnewapp.sh "$ 1  ") [[$?  -eq 0]] & amp; & amp;  cd "$ dir"}  
3
ответ дан 6 August 2018 в 03:44

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

  rnew () {local appdir = "$ HOME / code / $ 1" mkdir "$ appdir" ||  return echo "rvm use 1.8.7@$1" & gt;  «$ appdir / .rvmrc» (cd «$ appdir» & amp; rvm gemset создает «$ 1») ||  return rails new "$ 1" -m "$ HOME / code / config / base_template.rb" -T -J ||  return cd "$ appdir" & amp; & amp; & amp;  git init.  }  
1
ответ дан 7 August 2018 в 21:38

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

  ... echo "$ appdirectory" exit  

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

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

  rnew () {local dir = $ ($ HOME / .dotfiles / railsnewapp.sh "$ 1  ") [[$?  -eq 0]] & amp; & amp;  cd "$ dir"}  
3
ответ дан 7 August 2018 в 21:38

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

  ... echo "$ appdirectory" exit  

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

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

  rnew () {local dir = $ ($ HOME / .dotfiles / railsnewapp.sh "$ 1  ") [[$?  -eq 0]] & amp; & amp;  cd "$ dir"}  
3
ответ дан 10 August 2018 в 09:53

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

  rnew () {local appdir = "$ HOME / code / $ 1" mkdir "$ appdir" ||  return echo "rvm use 1.8.7@$1" & gt;  «$ appdir / .rvmrc» (cd «$ appdir» & amp; rvm gemset создает «$ 1») ||  return rails new "$ 1" -m "$ HOME / code / config / base_template.rb" -T -J ||  return cd "$ appdir" & amp; & amp; & amp;  git init.  }  
1
ответ дан 10 August 2018 в 09:53

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

  ... echo "$ appdirectory" exit  

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

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

  rnew () {local dir = $ ($ HOME / .dotfiles / railsnewapp.sh "$ 1  ") [[$?  -eq 0]] & amp; & amp;  cd "$ dir"}  
3
ответ дан 13 August 2018 в 16:11

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

  rnew () {local appdir = "$ HOME / code / $ 1" mkdir "$ appdir" ||  return echo "rvm use 1.8.7@$1" & gt;  «$ appdir / .rvmrc» (cd «$ appdir» & amp; rvm gemset создает «$ 1») ||  return rails new "$ 1" -m "$ HOME / code / config / base_template.rb" -T -J ||  return cd "$ appdir" & amp; & amp; & amp;  git init.  }  
1
ответ дан 13 August 2018 в 16:11

Другие вопросы по тегам:

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