sed 或其他命令行工具删除最后出现的 /
sed or some other command line tool to remove last occuring /
我想在我的 bashrc 中创建一个函数 cwhich ,它将 which $1 的结果存储在路径 var 中,然后 cd 到它。但是这样会启动一个软件,比如cwhichpython,cwhich blender等,我想把最后出现的/后面的文字截掉,然后cd到有效目录。这只是一个小小的不便,但通过寻找或寻求解决方案,我希望变得更加务实、高效和知识渊博。感谢帮助。
您要为此使用的外部工具是 dirname
。
所以你的函数看起来像这样:
cwhich() {
local bin=$(which "")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
据说这是两个外部工具,比您在这里真正需要的多两个。
您应该使用 type -p
或 command -v
而不是 which
。它们都是标准化的(which
不是)并且都是 shell 内置的(which
不是)所以它们更便携,保证在那里,并且会更快他们不会产生外部进程。 (尽管如此,我们无法避免使用 sub-shell。)
这使得函数:
cwhich() {
local bin=$(command -v -- "")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
虽然还有 dirname
,但我们不需要为此使用它,我们可以使用 Shell Parameter Expansion 来代替并保存外部进程(以及子 shell 这个时间):
cwhich() {
local bin=$(command -v -- "")
local bindir=${bin%/*}
cd -- "$bindir"
}
需要注意的是dirname
和${var%/*}
并不完全相同。在某些极端情况下它们有所不同,但对于这种用法,我认为这些极端情况中的任何一个都不重要。 (有关此差异的更多讨论,请参阅 this fantastic answer。)
您可能会注意到此函数中没有任何错误检查。我们现在应该添加它。
cwhich() {
local bin=$(command -v -- "")
local bindir=${bin%/*}
{ [ -z "$bin" ] || [ -z "$bindir" ]; } && return
cd -- "$bindir"
}
我想在我的 bashrc 中创建一个函数 cwhich ,它将 which $1 的结果存储在路径 var 中,然后 cd 到它。但是这样会启动一个软件,比如cwhichpython,cwhich blender等,我想把最后出现的/后面的文字截掉,然后cd到有效目录。这只是一个小小的不便,但通过寻找或寻求解决方案,我希望变得更加务实、高效和知识渊博。感谢帮助。
您要为此使用的外部工具是 dirname
。
所以你的函数看起来像这样:
cwhich() {
local bin=$(which "")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
据说这是两个外部工具,比您在这里真正需要的多两个。
您应该使用 type -p
或 command -v
而不是 which
。它们都是标准化的(which
不是)并且都是 shell 内置的(which
不是)所以它们更便携,保证在那里,并且会更快他们不会产生外部进程。 (尽管如此,我们无法避免使用 sub-shell。)
这使得函数:
cwhich() {
local bin=$(command -v -- "")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
虽然还有 dirname
,但我们不需要为此使用它,我们可以使用 Shell Parameter Expansion 来代替并保存外部进程(以及子 shell 这个时间):
cwhich() {
local bin=$(command -v -- "")
local bindir=${bin%/*}
cd -- "$bindir"
}
需要注意的是dirname
和${var%/*}
并不完全相同。在某些极端情况下它们有所不同,但对于这种用法,我认为这些极端情况中的任何一个都不重要。 (有关此差异的更多讨论,请参阅 this fantastic answer。)
您可能会注意到此函数中没有任何错误检查。我们现在应该添加它。
cwhich() {
local bin=$(command -v -- "")
local bindir=${bin%/*}
{ [ -z "$bin" ] || [ -z "$bindir" ]; } && return
cd -- "$bindir"
}