如何在fish shell中执行参数展开(parameter expansion)?
在Fish Shell中实现类似Bash参数展开的目录跳转功能
首先明确告诉你:Fish Shell确实支持参数展开,只是语法和Bash有些细微差别,而且实现你要的「一键返回上一级目录」功能,用Fish的原生语法比调用Bash脚本要简单得多。
核心解法:用Fish的字符串裁剪实现目录跳转
在Fish里,你可以直接对当前目录变量$PWD进行字符串裁剪来得到上一级目录,逻辑和Bash的参数展开思路一致:
cd "${PWD%/*}"
这里的%/*表示从字符串末尾开始,删除最后一个/及其后面的所有内容,正好能从/path/to/my/dir得到/path/to/my/。
封装成便捷命令:定义Fish函数
别用别名来实现back命令——因为别名只是简单的命令替换,没法直接在当前Shell环境执行cd(你之前用. back.sh没用,是因为Bash脚本的运行环境和Fish完全隔离,cd只作用于Bash子进程,不会影响Fish的当前目录)。
正确的做法是在~/.config/fish/config.fish里定义一个Fish函数:
function back cd "${PWD%/*}" end
保存后重启Fish,或者执行source ~/.config/fish/config.fish让配置生效,之后输入back就能直接跳转到上一级目录了。
进阶:支持跳多级目录
如果需要跳多级(比如直接回到/path/to/),可以给函数加个参数,让它支持自定义跳转层级:
function back # 默认跳1级,输入back 2则跳2级 set levels ${1:-1} set target_dir $PWD for i in (seq 1 $levels) set target_dir "${target_dir%/*}" end cd "$target_dir" end
这样输入back 2就能直接跳两级,灵活性拉满。
关于Fish的参数展开细节
Fish的参数展开文档其实包含了这些字符串操作,你可以用help string查看详细用法——它支持的模式匹配语法和Bash类似:
%pattern:从字符串末尾删除匹配pattern的最短部分%%pattern:从字符串末尾删除匹配pattern的最长部分#pattern:从字符串开头删除匹配pattern的最短部分##pattern:从字符串开头删除匹配pattern的最长部分
内容的提问来源于stack exchange,提问作者S. Sharma
相关产品推荐
相关产品推荐

