2010-04-04 8 views
1

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

так, например. если я нахожу «apache», я хочу, чтобы он изменил текущий каталог на/etc/apache2.

Однако, когда я использую команду «cd» внутри скрипта, кажется, что он меняет путь WITHIN скрипта, поэтому путь в оболочке не изменился.

Как я могу сделать эту работу?

+0

http: // stackoverflow.com/questions/874452/change-current-directory-from-a-script –

ответ

5

Используйте псевдоним или функцию или создайте сценарий вместо его выполнения.

BASH FAQ entry #60.

4

использовать функцию

to_apache(){ 
    cd /etc/apache 
} 

положить в файл, например, mylibrary.sh и всякий раз, когда вы хотите использовать его, подключит файл. например

#!/bin/bash 
source /path/mylibrary.sh 
to_apache 
2

Как сказал Игнасио, превратите его в функцию (или, возможно, псевдоним).

Способ, которым я, как правило, имеет это, имеет сценарий оболочки, который создает функцию - и сценарий и функция имеют одно и то же имя. Затем один раз в некоторый момент времени я отправлю сценарий («funcname»), и после этого я могу просто использовать эту функцию.

Я предпочитаю использовать функции для псевдонимов; проще управлять аргументами и т. д.

Кроме того, для конкретного случая смены каталогов я использую CDPATH. Трюк с использованием CDPATH, чтобы иметь пустую запись в начале:

export CDPATH=:/work4/jleffler:/u/jleffler:/work4/jleffler/src:\ 
/work4/jleffler/src/perl:/work4/jleffler/src/sqltools:/work4/jleffler/lib:\ 
/work4/jleffler/doc:/u/jleffler/mail:/work4/jleffler/work:/work4/jleffler/ids 

На этой машине, мой главный домашний каталог/work4/jleffler. Я могу добраться до большинства соответствующих подкаталогов за один раз с помощью «cd whatever».

Если вы не поместили пустую запись (или явную «.»), То вы не сможете «cd» в поддиректорию текущего каталога, что, по меньшей мере, смущает.

+0

У меня нет проблем с 'cd' в подкаталог без ведущего«: »в CDPATH. (Bash 3.2 или 4.0) –

+0

@ Dennis: ну, это может быть часть народных знаний, которую я взял из Korn Shell в Unix vs bash; это, безусловно, было проблемой, когда я впервые начал использовать его с ksh, но я не проверял, является ли это проблемой в bash (поскольку то, что у меня хорошо работает в bash). –

0

Игнасио Васкес-Абрамс дал ссылку на то, что, вероятно, отвечает на вопрос, хотя я действительно не следовал ему. Короткий ответ - использовать либо «источник», либо одну точку перед командой, например: . to apache

Но, я обнаружил, что есть проблемы с этим, если у вас есть более сложный скрипт. Похоже, что исходная переменная файла скрипта ($ 0) потеряна. Вместо этого я вижу «-bash», поэтому ваш сценарий не может отображать текст ошибки, который включает полное имя файла.

Кроме того, вы не можете использовать команду «exit», или ваша оболочка выйдет (особенно смущаясь из ssh).

Кроме того, функция «basename» дает ошибку, если вы ее используете.

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

Смежные вопросы