1

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

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

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

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

编辑:对不起,我应该更清楚我为什么要写/bin/bash cd ~而不是cd ~:我正在编写一个 bash 脚本,#!/bin/bash上面提到的 if 语句最终出现在 false 子句中。

4

4 回答 4

4

尝试以下操作:

/bin/bash -c "cd ~"
于 2012-08-26T19:32:49.347 回答
3

假设你做了

$ /bin/bash cd ~

您的 shell 解释cd/bin/bash. 例如,该语法可用于调用 shell 脚本。

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

$ cd ~ 
于 2012-08-26T19:32:25.873 回答
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

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

于 2012-08-26T19:33:26.840 回答
2

不要使用引号"" 示例:

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

~不在引号内展开""。采用$HOME

于 2012-08-26T19:47:55.683 回答