Shell script изменить каталог с переменной
Я знаю, что этот вопрос задавался много раз, но я все еще не мог найти хорошего решения. Следовательно, спрашивая его снова, если кто-нибудь может помочь!
Я пытаюсь изменить свой рабочий каталог внутри оболочки script с помощью переменной. Но я получаю " No such file or directory"
каждый раз.
#!/bin/bash
echo ${RED_INSTANCE_NAME} <-- This correctly displays the directory name
cd $RED_INSTANCE_NAME <-- This line gives the error
Теперь, когда я пытаюсь дать фактическое имя каталога вместо использования переменной, оболочка изменяет каталог без проблем
cd test <-- No error
Кто-нибудь знает, что может быть проблемой здесь? Пожалуйста, помогите!
Ответы
Ответ 1
Переменная содержит возврат каретки. Попробуйте сказать:
cd $(echo $RED_INSTANCE_NAME | tr -d '\r')
и он должен работать. Чтобы удалить CR из переменной, вы можете сказать:
RED_INSTANCE_NAME=$(echo $RED_INSTANCE_NAME | tr -d '\r')
Ниже проиллюстрирована проблема:
$ mkdir abc
$ foo=abc$'\r'
$ echo "${foo}"
abc
$ cd "${foo}"
: No such file or directory
$ echo $foo | od -x
0000000 6261 0d63 000a
0000005
$ echo $foo | tr -d '\r' | od -x
0000000 6261 0a63
0000004
$ echo $'\r' | od -x
0000000 0a0d
0000002
Ответ 2
Try
cd "$RED_INSTANCE_NAME"
Кроме того, убедитесь, что путь имеет смысл для текущего каталога, в котором выполняется команда cd
.
Ответ 3
Один из способов столкнуться с описанной проблемой - иметь тильду (~
) в имени переменной. Вместо этого используйте абсолютный путь или переменную $HOME
. Обратите внимание, что использование $HOME
потребует двойных котировок.
# doesn't work
$ vartilde='~/'
$ cd $vartilde
-bash: cd: ~: No such file or directory
# works
$ varfullpath='/Users/recurvirostridae'
$ cd $varfullpath
# works
$ varwithhome="$HOME"
$ cd $varwithhome
Ответ 4
Я не знаю, что для вас не так, но я могу предложить один общий совет:
cd "$RED_INSTANCE_NAME" # Quote the string in case it has spaces.error
Вы почти всегда ставите "$ VARIABLE" в кавычки. Это защитит от сюрпризов, когда значение переменной содержит смешные вещи (например, пробелы).
Ответ 5
Вы можете проверить возврат каретки, экраны ANSI и другие специальные символы с помощью
cat -v <<< "$RED_INSTANCE_NAME"
Это покажет все символы, которые echo $RED_INSTANCE_NAME
будет просто скрывать или игнорировать.
В частности, если ваше сообщение об ошибке : No such file or directory
в отличие от bash: cd: yourdir: No such file or directory
, это означает, что у вас есть возврат каретки в конце вашей переменной, возможно, из ее чтения из файла в формате DOS.
Ответ 6
Я столкнулся с другой проблемой. Мой "cd $ newDir" не удался, потому что я добавил вход в свой скрипт. Очевидно, что если вы добавляете канал в какую-либо команду cd, она ничего не делает или сожралась.
Потраченный впустую 3 часа, выясняя это.
newDir=$oldDir/more/dirs/
cd $newDir #works
cd $newDir | tee -a log #does nothing
cd $newdir | echo hi #does nothing
Итак, CD с любой pipeой ничего не делает. Не знаю, почему CD не работает. Канал означает "закончить", какую команду вы выполняете, а затем передать любой вывод следующей команде. Это на RHEL 7.
Я пытался записать все свои команды и ударил эту приятную ошибку. Я решил опубликовать его на случай, если кто-нибудь еще ударит.