我有以下设置:
在我的~/.bashrc中,我只调用一个脚本,我的实际设置存储在:中
source C:/path/To/mybashrc.sh
正如你可能看到的,我使用gitbash for Windows(不确定,如果这很重要的话(:
$ bash --version
GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
现在我想创建一个命令,使我能够直接编辑这个脚本。我发现了如何获得脚本的目录(1(,在另一篇文章中,我发现了怎样获得脚本名称本身(2(。
# Edit this file with nano
#(1)
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
#(2)
script_name=`basename "$0"`
# script_name="mybashrc.sh" # This works.
alias mybashrc='nano ${__dir}/${script_name}'
然而,我的问题是,我无法将这两种解决方案结合起来。当我尝试该脚本时,它会在nano的正确目录中打开一个名为bash
的文件,而不是mybashrc.sh
。问题可能是.bashrc
中脚本的来源,我想知道我是否还能找到所需的解决方案。我期待着任何暗示。(当然,注释外的行是有效的,因为名称是硬编码的,但这对我来说不是一个解决方案,因为脚本名称在现实世界中不同,我有。(
路径已在${BASH_SOURCE[0]}
中。您的代码从${BASH_SOURCE[0]}
获取目录,从$0
获取文件名。所以不要从$0
中获取,要从BASH_SOURCE[0]
中获取。
alias mybashrc="nano ${BASH_SOURCE[0]}"
但是,BASH_SOURCE[0]可能是相对的。所以,让我们确保它是绝对的。
alias mybashrc="nano $(readlink -f "${BASH_SOURCE[0]}")"
将在带有空格的路径上断开。更有经验的shell程序员可能会写:
alias mybashrc="nano $(printf "%q" "$(readlink -f "${BASH_SOURCE[0]}")")"
或者你可以使用一个在使用时扩展的变量,但仍然记得引用扩展:
thescript=$(readlink -f "${BASH_SOURCE[0]}")
alias mybashrc='nano "$thescript"'