如何忽略文件位置中的./字符?

时间:2013-11-19 11:15:18

标签: bash shell

我运行以下命令来获取.sh文件的位置并将其存储在变量中:

startupfile=`find . -name "startup.sh"`

以上结果是:

./server1/bin/startup.sh

下一步是运行startup.sh文件。

当我尝试sh $startupfile时,它无法运行服务器。

有没有办法忽略位置值中的./?任何其他方式来运行startup.sh脚本。

4 个答案:

答案 0 :(得分:0)

您应该使用:

startupfile=$(find . -name "startup.sh")

在BASH中不太优选:

startupfile=`find . -name "startup.sh"`

这称为command substitution

更新::发布问题编辑:

为避免以完整路径运行脚本,您可以在PATH变量中放置startup.sh的路径,因此~/.bashrc中的内容如此:

 export PATH=$PATH:~/server1/binripts

然后你可以运行:

startup.sh

从您的主目录的任何位置。

答案 1 :(得分:0)

./无害。

你还有另外一个问题。您是否在两个命令之间更改了目录? “脚本”实际上不是一个有效的脚本吗?

答案 2 :(得分:0)

./不是问题,它只是当前目录的一条(多余的)路径:./file././././file都是file的有效路径当前目录,前导./的数量没有任何区别。

查看原始问题的来源(在编辑之前为了更好的格式化),命令周围有单引号''sh $startupfile'。如果你在实际命令中也有那些,那就是你的问题;命令应该是:sh "$startupfile"

除此之外,很难说出问题可能是什么。检查echo "$startupfile"是否显示正确的路径,仅显示正确的路径。如果是,sh ./server1/bin/startup.sh是否有效?如果没有,那么错误是什么?

答案 3 :(得分:0)

回答您的具体问题:

有没有办法忽略位置值中的./?

有两种方法可以剥离主要目录名称。最有效但最不明确的是:

startupfile=${startupfile##*/}

删除左边最长的字符串'/'。第二种方式更为明显,但涉及创建子进程:

startupfile=$(basename "$startupfile")   

运行startup.sh脚本的任何其他方式。

是的,您可以使用PATH环境变量,正如@anubhava所说。我唯一要补充的是你需要对脚本执行访问权限; chmod u+x "$startupfile"

但是,名称“startupfile”的含义是它正在进行某种初始化,在这种情况下,您可能需要使用source相同的进程中运行它或.(点)命令:

source "$startupfile"

您可能仍需要文件名中的路径,或更新PATH