Bash скрипт для cd в каталог с пробелами в pathname
Я использую Bash на macOS X и хотел бы создать простой исполняемый файл сценария, который при запуске переключится в другой каталог. Однако путь к этому каталогу содержит пробелы. Как, черт возьми, ты делаешь это? Это то, что у меня есть...
Имя файла: cdcode
Содержание файла:
cd ~/My Code
Теперь предоставлено, это не длинный путь, но мой фактический путь имеет пять каталогов и в четырех из них есть пробелы.
Кстати, я пробовал cd "~/My Code"
и cd "~/My\ Code"
и ни один из них не работал.
Ответы
Ответ 1
Когда вы дважды указываете путь, вы останавливаете расширение тильды. Итак, есть несколько способов сделать это:
cd ~/"My Code"
cd ~/'My Code'
Тильда здесь не цитируется, поэтому расширение тильды все равно будет запущено.
cd "$HOME/My Code"
Вы можете развернуть переменные среды внутри строк с двойными кавычками; это в основном то, что делает расширение тильды.
cd ~/My\ Code
Вы также можете избежать специальных символов (например, пробела) с обратным слэшем.
Ответ 2
Я нашел решение ниже на этой странице:
x="test\ me"
eval cd $x
Комбинация \
в текстовой константе в двойных кавычках и в eval
перед cd
заставляет его работать как шарм!
Ответ 3
cd ~/My\ Code
похоже, работает для меня... Если выбрасывать кавычки, но сохранять косую черту не работает, можете ли вы разместить какой-нибудь пример кода?
Ответ 4
Вы можете использовать любой из:
cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"
Вы не можете использовать:
cd ~"/My Code"
Первый работает, потому что оболочка расширяет ~/в $HOME/, а затем накладывает на My Code без двойных кавычек. Второе не удается, потому что для ~"
для пользователя не указан пользователь 't22 > ' (двойная кавычка).
Ответ 5
Для меня работает одна обратная косая черта:
[email protected]:~$ mkdir "My Code"
[email protected]:~$ vi todir.sh
[email protected]:~$ . todir.sh
[email protected]:My Code$ cat ../todir.sh
#!/bin/sh
cd ~/My\ Code
Вы уверены, что проблема заключается не в том, что ваша оболочка script меняет каталог в своей подоболочке, но затем вы вернулись в основную оболочку (и оригинальный каталог), когда это было сделано? Я избегал этого, используя. для запуска script в текущей оболочке, хотя большинство людей просто использовали бы псевдоним для этого. Пространства могут быть красной селедкой.
Ответ 6
Избегайте ~ в скриптах; вместо этого используйте $HOME.
Ответ 7
После борьбы с той же проблемой, я попробовал два разных решения, которые работают:
1. Используйте двойные кавычки (""
) со своими переменными.
Самый простой способ - просто заключить в кавычки ваши переменные, как указано в предыдущем ответе:
cd "$yourPathWithBlankSpace"
2. Используйте eval
.
В соответствии с этой ответной командой Unix для экранирования пробелов вы можете убрать пробел, а затем использовать eval
, например:
yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
Ответ 8
При работе под Linux синтаксис ниже прав:
cd ~/My\ Code
Однако, когда вы выполняете свой файл, используйте синтаксис ниже:
$ . cdcode
(просто '.', а не './')
Ответ 9
использовать двойные кавычки
go ()
{
cd "$*"
}
Ответ 10
Самый простой способ сделать это -
$ cd My\ Folder
В bash запустите команду DIR, и в результатах вы увидите, что имена папок или путей, имеющие пробел между ними, были записаны в результатах, подобных этому -
$dir
My\ Folder
New\ Folder
Ответ 11
У меня была аналогичная проблема, когда я использовал bash script, чтобы сбрасывать некоторые данные. Я закончил создание символической ссылки в папке script без каких-либо пробелов в ней. Затем я указал на script на символическую ссылку и прекрасно работает.
Чтобы создать свою ссылку.
ln -s [ЦИФРОВОЙ КАТАЛОГ ИЛИ ФАЙЛ]./[SHORTCUT]
Мау или не может быть полезным.
Ответ 12
Используйте одинарные кавычки, например:
myPath=~/'my dir'
cd $myPath