Скрипты Bash Shell: какую простую логику мне не хватает - PullRequest
6 голосов
/ 14 ноября 2008

Это может быть слишком общий вопрос, как есть, но ... Я в тупике, пытаясь перемещаться по каталогам из сценария оболочки. Я не опытный пользователь * nix, но мне удобно работать через командную строку для большинства задач. Я хотел бы вызвать скрипт, который может переместить «я» в каталог, а не просто процесс скрипта, подобный следующему:

prompt:> goto lit   

где goto - псевдоним -> goto='./goscript'
и
goscript имеет простой код, например:

cd /path to work dirs/lit/user dir  

(при условии, что у каждого пользователя есть каталог внутри / lit)

Я сам избежал этой проблемы, установив мой личный псевдоним для перемещения в нужный каталог, запуска скрипта и возврата в исходный каталог. Этот вопрос был задан мне коллегой, который использует похожий метод, но хотел сделать процесс более общим, чтобы нам не нужно было создавать каждый псевдоним, который нам нужен. Я думал, что это будет легко решить проблему, но я в замешательстве, так как у меня нет большого опыта работы с сценариями оболочки ... пока.

Ответы [ 9 ]

9 голосов
/ 14 ноября 2008

Даже лучше, чем использовать псевдоним, как описывали другие, проверьте переменную CDPATH! Он в основном эквивалентен функциональности PATH, но применяется к команде cd .

Например, если я определю свой CDPATH как $CDPATH:${HOME}/subdir, а ~/subdir содержит другой каталог, subsubdir, тогда я могу просто выполнить:

cd subsubdir

из любого каталога и перейдите по пути, как и ожидалось.

Вот еще некоторые особенности:

http://www.caliban.org/bash/#bashtips

Чтобы установить переменную CDPATH, добавьте строку к вашему .bashrc, например

export CDPATH=$CDPATH:${HOME}/subdir
5 голосов
/ 14 ноября 2008

Вы можете создать функцию, которая называется goto (или любой другой), и убедиться, что она определена в вашем .bashrc (или вы можете «получить» ее из текущей оболочки):

function goto {
    #  the "$USER" part will expand to the current username
    # the "$1" will expand to the first argument to the function ("goto xyz" => $1 is "xyz")
    cd /some-path/lit/$USER/$1
}

Поместите это в ~ / .bashrc или в отдельный файл и вызовите «source the-file» из вашего приглашения, тогда вы можете вызвать функцию, как и любую другую программу:

prompt> goto folder
 cd /some-path/lit/your-user/folder
4 голосов
/ 14 ноября 2008

Чтобы выполнить скрипт в той же среде, что и ваша подсказка, вы должны вызвать его с помощью.

Скажем, у вас есть сценарий с именем:

cd .. 

если вы вызываете его с помощью. Вы получите:

$> pwd
$> /home/users/rd/proj
$> . up
$> pwd
$> /home/users/rd
2 голосов
/ 14 ноября 2008

Вы не можете. Сценарий имеет свою собственную копию среды, поэтому он не может изменить среду оболочки входа в систему.

1 голос
/ 26 января 2009

Я не был участником, когда я задал этот вопрос (по иронии судьбы мой анонимный вопрос о входе в систему имеет более высокий талант, чем мои официальные вопросы о входе, вместе взятые), поэтому я не могу закрыть его сейчас - Но- The Remo D. et al. Ответ будет тот, который привел к рабочему решению, в котором мы нуждались. Если кто-то с полномочиями мод может закрыть это и выбрать его в качестве принятого ответа, я бы оценил его.

0 голосов
/ 14 ноября 2008

В моем .rc, как правило, есть пара десятков псевдонимов, которые выглядят так:

alias work='cd /home/foo/work'
alias rails='cd /home/foo/rails'
alias assets='cd /home/foo/rails/assets'

и т.д.

Если это не сработает для вас, вы можете использовать отладочные хуки в bash, чтобы заменить командную строку на месте перед ее выполнением - если ключевое слово 'goto' является первым на линия. Это будет связано с поиском «ловушки» в bash, но имейте в виду, что такие заклинания не ведут себя одинаково на всех системах. Я написал один такой опыт несколько месяцев назад, и вы можете результаты .

0 голосов
/ 14 ноября 2008

Каждый скрипт имеет свое представление о текущем рабочем каталоге. «cd» - это не процесс, а встроенная оболочка.

Способ сделать то, что вы хотите, это создать псевдоним. В csh это будет что-то вроде:

alias goto 'cd /path_to_work/\!*/user_dir'

sh / bash имеют аналогичные псевдонимы

0 голосов
/ 14 ноября 2008

Вы можете выполнить некоторые простые вещи, как это, используя псевдоним. Например, у меня есть несколько псевдонимов, которые помещают меня в рабочую среду и настраивают переменные для нашей системы Makefile. Вот настоящий псевдоним, который я использую в качестве примера. '&&' будет продолжать выполнять команды до тех пор, пока не произойдет сбой одной из них - в таких простых сценариях очистка не требуется, поскольку сбой маловероятен.

alias main1='cd ~/code/main1 && export TOP=`pwd` && export DEBUG=1'

Если вы хотите создать совместно используемую библиотеку псевдонимов среди ваших коллег, вы можете поделиться ими через NFS и получить исходный файл для включения.

0 голосов
/ 14 ноября 2008

Вы не можете использовать cd в скрипте bash. Вы можете использовать псевдоним cd и path.

alias goto='cd /path_to_work/usr/dir'

ОБНОВЛЕНИЕ: вы поместите эту строку в ваш файл .bashrc, а затем выполните

source ~/.bashrc

для создания псевдонима.

...