Linux/Unix:Shell脚本找出目录脚本文件所在的位置

时间:2020-01-09 10:42:23  来源:igfitidea点击:

如何找出我的bash脚本所在的目录,以便读取名为.backup .ignore .target的配置文件。
例如,如果我的脚本位于>/home/foo/script.sh中,则需要读取/home/foo/.{backup,ignore,target}文件。
如何在Linux或者Unix等操作系统上运行的Bash中找出当前目录位置和Shell脚本目录位置?

您可以使用以下任何一种方法来查找路径名的一部分:

  • basename命令显示路径名的文件名部分。
  • dirname命令显示路径名的目录部分。
  • Bash参数替换。
  • $0扩展为shell或者shell脚本的名称。示例:Shell脚本找出脚本文件所在的目录以下示例显示目录路径或者/home/theitroad/scripts/foo.sh的一部分:
dirname /home/theitroad/scripts/foo.sh

以下行将shell变量i设置为/home/theitroad/scripts:

i=`dirname /home/theitroad/scripts/foo.sh`
echo "$i"

或者

i=$(dirname /home/theitroad/scripts/foo.sh)
echo "$i"

在bash脚本中使用$0代替/home/theitroad/scripts/foo.sh:

#!/bin/bash
script="
Script name /tmp/test.sh resides in /tmp directory.
" basename="$(dirname $script)"   echo "Script name $script resides in $basename directory."

输出示例:

var=${path%/*}

使用bash shell ${var%pattern}语法要从最短的后部(结束)模式中删除,请使用以下语法:

x="/Users/theitroad/scripts/bar.sh"
echo "${x%/*}"
y="${x%/*}"
echo "$y"

例如:

#!/bin/bash
# Purpose : Linux / Unix shell script find out which directory this script file resides
# ------------------------------------------------------------------------------------
script="
$ chmod +x /tmp/test.sh
$ /tmp/test.sh
" basename="${script%/*}" config1="${basename}/.backup" config2="${basename}/.ignore" config3="${basename}/.target"   echo "Script name $script resides in $basename directory." echo "Reading config file $config1 $config2 $config3, please wait..."

上面脚本的更新版本:

#!/bin/bash
# Purpose : Linux / Unix shell script find out which directory this script file resides
# Author : theitroad <http://www.theitroad.local> under GPL v2.x+
# ------------------------------------------------------------------------------------
 
## Who am i? ##
## Get real path ##
_script="$(readlink -f ${BASH_SOURCE[0]})"
 
## Delete last component from $_script ##
_mydir="$(dirname $_script)"
 
## Delete /path/to/dir/ component from $_script ##
_myfile="$(basename $_script)"
echo "Script : $_script"
echo "Directory portion of $_script : $_mydir"
echo "Filename portion of $_script : $_myfile"

运行:

./demo.bash
cd /home/Hyman/
../../tmp/demo.bash
/tmp/demo.bash

有关查找物理路径或者真实路径的说明

您可能无法获得真实的物理路径,并且真实路径可能是符号链接。要获取物理路径,请使用realpath命令。 realpath命令使用realpath()函数来解析路径中的所有符号链接,多余的/字符以及对/./和/../的引用。这对于Shell脚本和与安全性相关的应用程序很有用。另一个推荐的选项是使用readlink命令显示符号链接或者规范文件名的值:

##代码##

保存并关闭文件。运行:

##代码##