脚本的父目录

时间:2014-11-23 09:37:59

标签: bash

所以我是Linux的新手,我需要一些帮助。我必须编写一个bash脚本,我必须使用脚本的父目录在那里创建一个文件,无论脚本在哪里。它应该是这样的:

如果我的脚本在“/ home / student /”中,我需要使用脚本命令创建/ home /中另一个名为txt的文件。有什么想法吗?谢谢。

3 个答案:

答案 0 :(得分:2)

如果您希望能够从任何地方运行脚本,那就非常精细了。

例如:如果您的脚本位于/home/myHome/someDir/someOther,并且您希望在运行脚本时在/home/myHome/someDir中创建文件。

要解决此问题,您只需要首先派生脚本所在的目录。

可以使用:

完成
 SCRIPT_DIRECTORY="$(dirname "$0")"
 touch "$SCRIPT_DIRECTORY/../myFile.txt"

编辑:如果你想处理符号链接,实际上它可能会更加微妙。即:如果符号链接/home/myHome/mySymlink指向您的脚本,并且是实际被调用的那个,则前一个脚本将考虑/home/myHome/而不是/home/myHome/someDir/someOther

要处理这种情况,你可以做

if [ -L "$0" ] && [ -x $(which readlink) ]; then
  ACTUAL_SCRIPT_FILE="$(readlink -mn "$0")"
else
  ACTUAL_SCRIPT_FILE="$0"
fi
SCRIPT_DIRECTORY="$(dirname "$ACTUAL_SCRIPT_FILE")"
touch "$SCRIPT_DIRECTORY/../myFile.txt"

答案 1 :(得分:1)

使用..指向父目录。所以你可以用

之类的东西创建一个文件
MY_SCRIPTDIR="$(dirname $0)"
touch ${MY_SCRIPTDIR}/../abc.txt

从命令提示符或shell脚本中。

答案 2 :(得分:0)

不幸的是,其他答案要么为您提供当前工作目录而不是脚本所在的目录,要么如果脚本或其中一个目录是符号链接而不是真实目录,它们将无法工作

将起作用:

dirname $(readlink -f "$0")

说明:

  • “$ 0”是您在命令行中键入脚本时的名称。引用对于包含空格的情况很重要。
  • readlink将解决沿途的任何符号链接
  • dirname仅从脚本的完整路径中获取目录名称 - 对于角落案例而言,它比手动查找斜杠等更具可读性和安全性。

现在,即使在复杂的情况下,您也会得到正确的结果:如果您的脚本位于/tmp并且您在/tmp/abc/中创建了一个符号链接,那么您当前的目录将是{{ 1}}并且您运行/home,它将正确输出/tmp/abc/your-script,而不是/tmp/home