21

我知道这个问题已经被问过很多次了,但我仍然找不到任何好的解决方案。因此,再次询问是否有人可以提供帮助!

我正在尝试借助变量更改 shell 脚本中的工作目录。但我" 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

现在,当我尝试给出实际目录名称而不是使用变量时,shell 会毫无问题地更改目录

cd test  <-- No error

有谁知道这里可能是什么问题?请帮忙 !!

4

6 回答 6

25

你的变量包含一个回车。试着说:

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
于 2013-10-10T04:58:05.567 回答
18

遇到您所描述的问题的一种方法是~在变量名中使用波浪号 ( )。请改用绝对路径或$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
于 2016-08-13T17:28:34.513 回答
8

尝试

cd "$RED_INSTANCE_NAME"

cd此外,请确保路径对执行命令 的当前目录有意义。

于 2013-10-09T19:57:50.753 回答
4

我遇到了一个不同的问题。我的“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 与任何管道什么都不做。不知道为什么 cd 失败。管道表示完成您执行的命令,然后将任何输出提供给下一个命令。这是在 RHEL 7 上。
我试图记录我的所有命令并遇到这个不错的错误。我想我会发布它以防其他人点击它。

于 2019-09-19T04:39:27.537 回答
2

您可以使用以下命令检查回车符、ANSI 转义符和其他特殊字符

cat -v <<< "$RED_INSTANCE_NAME"

这将显示所有echo $RED_INSTANCE_NAME将隐藏或忽略的字符。

特别是,如果您的错误消息: No such file or directory与 相反bash: cd: yourdir: No such file or directory,这意味着您的变量末尾有一个回车,可能是从 DOS 格式的文件中读取的。

于 2013-10-09T21:01:37.417 回答
1

我不知道你出了什么问题,但我可以提供一条一般性建议:

cd "$RED_INSTANCE_NAME"       # Quote the string in case it has spaces.error

您几乎应该总是将“$VARIABLE”放在引号中。当变量的值包含有趣的东西(如空格)时,这将防止意外。

于 2013-10-09T19:59:03.527 回答