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

时间:2012-08-26 19:28:16

标签: linux bash

问题出在标题中。我在谷歌上找不到任何东西,所以我希望有人可以向我解释这个。

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

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

test -d "~/some_dir"在if语句中返回false(some_dir exsits)

编辑: 抱歉,我应该更加清楚我写/bin/bash cd ~而不是cd ~的原因:我正在编写一个带有#!/bin/bash的bash脚本,上面提到的if语句最终会出现在false中子句。

4 个答案:

答案 0 :(得分:3)

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

作为测试,尝试按该名称创建目录,并查看错误是否消失。

> 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

详细的错误报告非常方便,但如果您不需要它们,那么保持代码较小也具有优势。

答案 1 :(得分:2)

假设你做了

$ /bin/bash cd ~

你的shell将cd解释为/bin/bash的参数。该语法可以是例如用于调用shell脚本。

您最想要的是更改当前的工作目录。在这种情况下,你只需要

$ cd ~ 

答案 2 :(得分:2)

尝试以下方法:

/bin/bash -c "cd ~"

答案 3 :(得分:2)

不要使用引号"" 例如:

$ test -d ~/.aptitude
$ echo $?
0
$ test -d "~/.aptitude"
$ echo $?
1

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