Как передать путь с пространством в нем к CD в сценарии

Я работаю над Windows 10 и использую подсистему Ubuntu. Часто я должен измениться между каталогами Windows и Linux, таким образом, я хотел записать сценарий, который автоматически преобразовывает путь Windows к пути Linux и затем изменяет каталоги. Я записал сценарий преобразования очень хорошо, но по некоторым причинам я не могу передать путь к CD.

Пример:

$ mkdir temp\ space
$ temp=$(echo "temp\ space") # simulate script that converts path
$ echo $temp
temp\ space
$ cd $temp
-bash: cd: temp\: No such file or directory

Править:

В заднем виде я понял, что это на самом деле не было моей проблемой, я, должно быть, устал, когда я записал это, и введите эту ошибку в мой минимальный пример. Моя настоящая проблема состояла в том, что я не знал, как выполнить сценарий оболочки в текущей оболочке вместо подоболочки. Поблагодарите Вас все за свою справку!

1
задан 10 October 2018 в 18:45

2 ответа

Когда вы цитируете строку, "", вы говорите: «Используйте эту строку». Нет необходимости выходить из пробела, потому что вы инкапсулировали свою строку в двойные кавычки.

Когда вы используете терминал, и вы не не инкапсулируете строку в кавычки, терминал хочет видеть пробел в качестве нового аргумента и запутывается. Вы знакомы с файлами CSV? Подумайте о файле CSV, в котором запятая найдена как часть одного из значений ячейки. В обоих случаях нам необходимо уточнить разделитель . В то время как файлы CSV будут использовать запятую, bash и программы часто используют пробелы для разделения или разделения аргументов командной строки и их значений.

Итак, вам нужно либо заключить в кавычки строки, содержащие пробелы, либо экранировать пробелы в строке; не оба.

Из-за этого существует много «лучших практик» при использовании переменных BASH. Например, вы всегда захотите заключить их в кавычки , чтобы обойти проблему, с которой вы столкнулись:

mv thisFile My Space Directory/ # What moves where?
mv thisFile "My Space Directory/" # It is clear what to move where
mv thisFile My\ Space\ Directory/ # Again, clear to the computer
mv thisFile "${tmp}" # Be sure string is not escaped.

Как правило, вы выходите из пробелов только тогда, когда Вы сами взаимодействуете с терминалом для таких вещей, как завершение Tab или для выполнения других ручных настроек.

Кроме того, обратите внимание, что bash рассматривает ' и " немного по-разному, в том что ' не разрешит расширение, в то время как " будет. Например:

$ BANANA_COUNT=4
$ newVar1="We have this many bananas: ${BANANA_COUNT}"
$ newVar2='We have this many bananas: ${BANANA_COUNT}'
$ echo $newVar1
We have this many bananas: 4
$ echo $newVar2
We have this many bananas: ${BANANA_COUNT}
3
ответ дан 7 December 2019 в 13:21

Необходимо использовать двойные кавычки " окружить файлы, папки или переменные, которые содержат специальные символы или пробел.

От примера Вы при условии, что был бы следующие:

~$ mkdir "temp space"
~$ temp=$(echo "temp space")
~$ echo "$temp"
temp space
~$ cd "$temp"
temp space$ 
1
ответ дан 7 December 2019 в 13:21

Другие вопросы по тегам:

Похожие вопросы: