Что я делаю не так в этой функции bash? - PullRequest
0 голосов
/ 21 сентября 2010

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

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 regexp на 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 каждой комбинацией цитат, о которой только могу подумать, но пока не повезло.

Ответы [ 4 ]

4 голосов
/ 21 сентября 2010

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

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

Просто

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

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

function projects () {
  cd ~/"Projects/Working Branches/$1"
}
2 голосов
/ 21 сентября 2010

Может быть, вы чрезмерно разбираетесь в этом:

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

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

2 голосов
/ 21 сентября 2010

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

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

1 голос
/ 21 сентября 2010

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

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

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

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