2

Я действительно новичок в bash, так как всегда развивался на машине с Windows (да, я знаю). До недавнего времени я был в состоянии перейти в DIR с помощью

cd a\ dir\ name\ with\ spaces/

но вдруг это уже не работает. Даже используя автозаполнение TAB, он будет генерировать правильные значения, но я всегда встречал что-то вроде

-bash: cd: a: No such file or directory

друг упомянул, что это может быть связано с путем. Кто-нибудь может пролить свет на этот вопрос для меня?


Ниже мой .bash_profile

# Exe subshell script
source ~/.bashrc

И .bashrc

function cs ()
{
  cd $1
  ls
}

# A new version of "cd" which
# prints the directory after cd'ing
cd() {
        builtin cd $1
        pwd
}

1 ответ1

5

Правильная замена будет:

cd() {
    builtin cd "$1"
    pwd
}

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


Зачем мне это делать?

Давайте рассмотрим:

  • Допустим, вы вызываете свою пользовательскую функцию cd с аргументом with\ spaces .
  • Очевидно, вам нужно сделать это, поскольку в противном случае ваша функция получит два аргумента, а именно with и spaces .
  • Итак, правильно экранируя, ваша функция получает with spaces качестве одного аргумента.
  • Вы передаете этот аргумент builtin cd используя $1 .
  • $1 автоматически расширяется до with spaces (так как это то, что получила функция).
  • Ваш звонок теперь builtin cd with spaces/
  • Это снова приводит к вызову cd - диск с двумя аргументами with и spaces

Итак, чтобы это исправить:

  • Цитировать $1 с двойными кавычками.
  • Команда расширена до builtin cd "with spaces" .
  • Теперь cd снова корректно вызывается с одним аргументом.

Другая возможность состоит в том, чтобы просто использовать более общий "$@" вместо "$1" для передачи всех параметров, а не только первого, другому сценарию. Это то, что вы хотите сделать в 99% случаев.

cd() {
    builtin cd "$@"
    pwd
}

Очевидно, то же самое исправление применимо к вашей функции cs() .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .