2010-09-21 3 views
0

Я пытаюсь создать функцию, которая идет в конкретный каталог, и если указан один аргумент, добавьте это в строку каталога. Но независимо от того, что я пытаюсь, я не могу заставить его работать, и bash всегда сообщает, что X не является каталогом, хотя если я скопирую его в новую командную строку, он будет работать оттуда.Что я делаю неправильно в этой функции bash?

function projects() 
{ 
    DIR= 
    if [ -n "$1" ] 
    then 
    DIR=$1 
    fi 
    echo "~/Projects/Working Branches/$DIR" | sed 's/ /\\&/g' | xargs cd 
}  

-

$ projects Parametric\ Search\ API 
/usr/bin/cd: line 4: cd: ~/Projects/Working Branches/Parametric Search API: No such file or directory 
$ projects "Parametric Search API" 
/usr/bin/cd: line 4: cd: ~/Projects/Working Branches/Parametric Search API: No such file or directory 

Я также попытался модифицировать SED регулярное выражение для s/ /\\\\\\&/g, который производит то, что, как представляется, правильно спасся строка, но результаты в точно такой же ошибки

$ projects Parametric\ Search\ API 
/usr/bin/cd: line 4: cd: ~/Projects/Working\ Branches/Parametric\ Search\ API: No such file or directory 
$ projects "Parametric Search API" 
/usr/bin/cd: line 4: cd: ~/Projects/Working\ Branches/Parametric\ Search\ API: No such file or directory 

Наконец-то я пробовал окружающие $DIR с каждой комбинацией кавычек, о которых я могу думать, но пока не повезло.

+1

Это принадлежит на StackOverflow. – Chris

+2

Вы должны использовать '$ HOME' вместо' ~ 'в скриптах. Откуда у вас '/ usr/bin/cd'? Он ничего не может сделать полезным. (Ну, есть исключения.) Вам не нужно избегать места в каталоге. Кавычки позаботятся о пространстве. –

+0

@Dennis - строки, начинающиеся с '/ usr/bin/cd', выводятся из bash, сообщая мне, что есть ошибка с моим вызовом' cd' –

ответ

4

Итак, одна проблема заключается в том, что если вы укажете путь с ~, то оболочка не будет расшифровываться, прежде чем передавать его в cd. Вы можете исправить это, используя вместо этого $HOME, или поместив ~/ вне кавычек.

Кроме того, вам не нужно устанавливать условно $DIR на основе $1, и вам не нужно использовать sed и xargs. Просто используйте $1 прямо на вашем пути; если он пуст, этот компонент каталога будет пустым, оставив вас только с каталогом Working Branches в качестве аргумента cd.

Просто

function projects() { 
    cd "$HOME/Projects/Working Branches/$1" 
} 

должен работать, как это делал бы немного короче, но менее ясно

function projects() { 
    cd ~/"Projects/Working Branches/$1" 
} 
+0

Спасибо за вашу помощь! –

1

xargs и cd не работает вместе в моем bash. Я думаю, это потому, что xargs хочет приложение, а cd - это встроенная функция в оболочке bash.

попробуйте echo "Projects" | xargs cd в вашем домашнем каталоге, если это так.

Другая проблема заключается в том, что ~ не расширяется, как вы думаете по эхо. Вместо этого попробуйте использовать полный путь. Или использовать кавычку расширить ~

echo ´echo ~/`"Projects/Working Branches/$DIR" 
2

Может быть, вы более-инженерным это:

cd "~/Projects/Working Branches/" 
cd "$DIR" 

Я не получить назначение команды sed, хотя, так что, может быть, я отсутствует что-то.

+1

И вы можете объединить это в один 'cd '$ HOME/Projects/Working Branches/$ DIR" ' –

+0

Я использовал sed, чтобы попытаться избежать пробелов в пути с' \ ' –

2

Проблема заключается в том, что расширение тильды выполняется оболочкой (bash) и что ни xargs, ни cd, ни ОС не сделают этого. Вот почему каталог, содержащий ~, неизвестен. Вместо этого вы можете использовать $ HOME вместо ~, который будет заменен рабочим каталогом между двойными кавычками или поместить тильду вне кавычек (т. Е. ~/"...").

Кроме того, вызов cd с помощью xargs не изменит рабочий каталог, так как cd запускается в отдельном процессе, рассмотрите только использование cd ~/"Projects/Working Branches /".

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

  • Нет связанных вопросов^_^