Навігація до каталогу з пробілами вже неможлива


2

Я реально новачок у баші, тому що завжди розвивався на машині 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
}

це генерує правильну команду, тобто означає, що вона генерує втечі належним чином? Я не можу уявити, що це "раптом" не працює. Ви змінили будь-який з файлів особистої конфігурації bash (наприклад ~/.bash_profile)?
slhck

відредагували. Так, я редагував bash_profile. Я просто подивився і прокоментував своє останнє редагування "джерело ~ / .bashrc", і воно працює знову! Слід було додати додаткову функцію 'cs', яка міститься у .bash_rc, використовуючи аналогічний підхід, описаний joshstaiger.org/archives/2005/07/bash_profile_vs.html для osX. Будь-яка ідея, чому це не перестає працювати просторами?
Дорі

зроблено, додали до ОП
Дорі

Відповіді:


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()функції.


1
+1 Також потрібно вказати "$ 1" у csфункції.
Гленн Джекман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.