2014-11-23 70 views
0

所以我是Linux的新手,需要一些帮助。我必须编写一个bash脚本,在脚本中,我必须使用脚本的父目录在脚本的任何位置创建一个文件。它应该看起来像这样:脚本的父目录

如果我的脚本位于“/ home/student /”中,则需要使用in-script命令创建另一个名为txt的文件/ home /。请有任何想法吗?谢谢。

回答

1

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

MY_SCRIPTDIR="$(dirname $0)" 
touch ${MY_SCRIPTDIR}/../abc.txt 

从你的命令提示符或shell脚本中创建一个文件。

+0

'..'是相对于当前目录,而不是脚本所在的目录。你需要从'$ 0'获取脚本位置。 – 2014-11-23 09:46:58

+0

是的假设OP知道脚本在哪里运行。但将修改答案更具体。谢谢。 – SMA 2014-11-23 09:50:59

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

'cd'有点太多了,并且有副作用(顺便说一下,你需要'cd -'回到最后或使用'pushd' /'popd')。为什么不只是'SCRIPT_DIR =“$(dirname $ 0)”'并使用相对路径? – 2014-11-23 09:44:51

+0

看来你是对的:'SCRIPT_DIR =“$(dirname $ 0)”'工作。感谢您指出 – gturri 2014-11-23 09:50:04

+0

请在回答中使用引用的版本:'“$(dirname $ 0)”''和$“SCRIPT_DIRECTORY /../ myFile.txt”'。 – 2014-11-23 09:51:41

0

不幸的是,其他答案或者给你当前的工作目录而不是脚本所在的目录,或者如果脚本或者其中一个目录是符号链接而不是真实目录,它们将不起作用。

什么工作是:

dirname $(readlink -f "$0") 

说明:

  • “$ 0” 是你在命令行中键入它的脚本的名称。引用对于包含空格的情况很重要。
  • readlink将解决沿途的任何符号链接
  • dirname只需目录名称从脚本的完整路径 - 这是更好的可读性,更安全的角落情况下比手动寻找斜线等

现在,你将得到即使在复杂的情况下,正确的结果:如果你的脚本是在/tmp,你在/tmp/abc/创建符号链接到它,并且你的当前目录将是/home并运行/tmp/abc/your-script,使其能正确输出/tmp,不/home也不/tmp/abc

+0

我认为这样的答案应该以''开头“假设你需要使用原始脚本的位置,当你在不同的路径下创建它的符号链接...”。 – 2014-11-23 10:01:58