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.
Я пытался записать все свои команды и ударил эту приятную ошибку. Я решил опубликовать его на случай, если кто-нибудь еще ударит.