Linux “/bin/bash-cd~”导致“/bin/bash:cd:没有这样的文件或目录”,为什么?

Linux “/bin/bash-cd~”导致“/bin/bash:cd:没有这样的文件或目录”,为什么?,linux,bash,Linux,Bash,问题在标题中。我在谷歌上找不到任何东西,所以我希望这里有人能给我解释一下 我使用的是debian 6.0.5,/etc/passwd文件中分配给执行用户的shell是/bin/bash 因此,只需编写cd~即可工作,并将我带到用户主目录 test-d~/some\u dir在if语句中返回false some\u dir存在 编辑: 很抱歉,我应该更清楚我为什么要写/bin/bash cd~而不是cd~:我正在用/bin/bash和上述if语句以false子句结尾。假设您这样做了 $ /bin/

问题在标题中。我在谷歌上找不到任何东西,所以我希望这里有人能给我解释一下

我使用的是debian 6.0.5,/etc/passwd文件中分配给执行用户的shell是/bin/bash

因此,只需编写cd~即可工作,并将我带到用户主目录

test-d~/some\u dir在if语句中返回false some\u dir存在

编辑: 很抱歉,我应该更清楚我为什么要写/bin/bash cd~而不是cd~:我正在用/bin/bash和上述if语句以false子句结尾。

假设您这样做了

$ /bin/bash cd ~
shell将cd解释为/bin/bash的参数。该语法可用于调用shell脚本

您最可能想要的是更改当前的工作目录。那样的话,你只需要

$ cd ~ 
假设你这么做了

$ /bin/bash cd ~
shell将cd解释为/bin/bash的参数。该语法可用于调用shell脚本

您最可能想要的是更改当前的工作目录。那样的话,你只需要

$ cd ~ 
请尝试以下操作:

/bin/bash -c "cd ~"
请尝试以下操作:

/bin/bash -c "cd ~"

在运行命令之前,任何命令行的选项都会展开,即使对于内部命令也是如此。无论您使用什么shell来运行/bin/bash cd~都可能会逐字解释tilde,而不是扩展到主目录的特殊字符

作为测试,尝试创建一个同名目录,看看错误是否消失

> mkdir ./~
> /bin/bash cd ~
请注意,cd命令需要在运行的shell中执行才能发挥作用。当您更改子shell的工作目录,然后子shell退出时,您会发现自己回到了开始的位置

更新:

在bash脚本中,您应该能够使用$HOME环境变量,该变量应始终包含您的主目录。我不知道什么情况会导致瓷砖扩展失败,但我一直使用$HOME

此外,在确定是否可以更改为特定目录时,可以选择显式并返回有用状态:

unset err
if [[ ! -d "$somedir" ]]; then
  err="Can't find $somedir"
elif [[ ! -r "$somedir" ]]; then
  err="Can't read $somedir"
fi

if [[ -n "$err" ]]; then
  echo "$ERROR: $err" >&2
  exit 1
fi

cd "$somedir"
或者,你可以试试CD,看看结果

if ! cd "$somedir"; then
  echo "ERROR: $somedir not availble"
  exit 1
fi

详细的错误报告很方便,但如果您不需要,保持代码小也有好处。

任何命令行的选项都会在命令运行之前展开,即使对于内部命令也是如此。无论您使用什么shell来运行/bin/bash cd~都可能会逐字解释tilde,而不是扩展到主目录的特殊字符

作为测试,尝试创建一个同名目录,看看错误是否消失

> mkdir ./~
> /bin/bash cd ~
请注意,cd命令需要在运行的shell中执行才能发挥作用。当您更改子shell的工作目录,然后子shell退出时,您会发现自己回到了开始的位置

更新:

在bash脚本中,您应该能够使用$HOME环境变量,该变量应始终包含您的主目录。我不知道什么情况会导致瓷砖扩展失败,但我一直使用$HOME

此外,在确定是否可以更改为特定目录时,可以选择显式并返回有用状态:

unset err
if [[ ! -d "$somedir" ]]; then
  err="Can't find $somedir"
elif [[ ! -r "$somedir" ]]; then
  err="Can't read $somedir"
fi

if [[ -n "$err" ]]; then
  echo "$ERROR: $err" >&2
  exit 1
fi

cd "$somedir"
或者,你可以试试CD,看看结果

if ! cd "$somedir"; then
  echo "ERROR: $somedir not availble"
  exit 1
fi
详细的错误报告很方便,但如果您不需要,保持代码小也有好处。

不要使用引号 例如:

~未在引号中展开。使用$HOME

不要使用引号 例如:


~未在引号中展开。使用$HOME

也许这是在?我没有得到你的编辑,为什么你不直接测试目录?也许这是在?我没有得到你的编辑,为什么你不直接测试目录?cd$HOME呢$家和~我想cd$HOME怎么样$HOME与~I think~相同,用$HOME替换~I对我来说是一个足够好的解决方案,谢谢。用$HOME替换~I对我来说是一个足够好的解决方案,谢谢。+1我只是被它咬了一口。我想我的脚本已经够复杂了,应该是Python的…+1我只是被它咬了一口。我想我的脚本已经够复杂了,应该是Python的。。。