如何在zsh命令行中访问并修改命令内的位置参数?
在Zsh命令行中复用并修改当前命令的位置参数
方法一:使用历史扩展(!#)
Zsh的历史扩展功能可以直接引用当前正在输入的命令参数,核心是用!#指代当前命令行,再通过:n提取第n个参数,结合参数展开实现修改:
- 基础用法示例(对应你的ffmpeg场景):
ffmpeg -i path/to/long/filename.original new/destination/${!#:1:t:s/original/output}
!#:1:获取当前命令的第一个参数(即输入文件路径):t:提取路径中的文件名部分(去掉目录前缀):s/original/output:将文件名里的original后缀替换为output
- 处理含空格的路径:
如果路径包含空格,用(Q)修饰符解析带引号的参数,避免空格拆分问题:
ffmpeg -i "path with spaces/filename.original" new/destination/${${(Q)!#:1}:t:s/original/output}
方法二:临时定义快捷函数(适合高频操作)
如果经常需要这类参数复用修改,可以定义一个临时函数,省去每次输入复杂历史扩展的麻烦:
ffmpeg-convert() { local input="$1" local output="new/destination/${input:t:s/original/output}" ffmpeg -i "$input" "$output" }
调用时只需输入:
ffmpeg-convert path/to/long/filename.original
注意事项
- 历史扩展中的
!符号如果和其他语法冲突,可以用\!转义,但命令行直接输入时通常无需转义 - 参数展开的修饰符(
:t、:s)是Zsh专属功能,bash环境下无法使用
内容的提问来源于stack exchange,提问作者Kyle Barbour
相关产品推荐
相关产品推荐

