如何在Bash中将`...`设为`../..`的别名以适配多命令?
实现
...作为两级上级目录路径的方法 你之前的尝试失败是因为bash的alias是用来定义命令别名的,不是路径别名。直接把...别名设为../..,输入cd ...时,bash会把...当成命令去执行,而不是作为cd的路径参数,自然会报错。
要让...能作为路径参数支持cd、ls、realpath等命令,可以通过为这些命令写包装函数的方式,自动将参数里的...替换为../..:
1. 单个命令的包装函数示例
以cd为例,在~/.bashrc中添加以下函数:
cd() { # 遍历所有参数,替换...为../.. local modified_args=() for arg in "$@"; do if [[ "$arg" == "..." ]]; then modified_args+=("../..") else modified_args+=("$arg") fi done # 调用真正的cd命令 builtin cd "${modified_args[@]}" }
同理,为ls和realpath添加包装函数:
ls() { local modified_args=() for arg in "$@"; do if [[ "$arg" == "..." ]]; then modified_args+=("../..") else modified_args+=("$arg") fi done builtin ls "${modified_args[@]}" } realpath() { local modified_args=() for arg in "$@"; do if [[ "$arg" == "..." ]]; then modified_args+=("../..") else modified_args+=("$arg") fi done builtin realpath "${modified_args[@]}" }
2. 更通用的批量处理方式
如果需要支持更多命令,可以写一个通用的替换函数,再批量生成包装函数:
# 定义通用的参数替换函数 replace_dot_args() { local cmd="$1" shift local modified_args=() for arg in "$@"; do if [[ "$arg" == "..." ]]; then modified_args+=("../..") elif [[ "$arg" == "...." ]]; then # 可选:支持四级上级目录 modified_args+=("../../..") else modified_args+=("$arg") fi done builtin "$cmd" "${modified_args[@]}" } # 为需要支持的命令生成包装函数 for cmd in cd ls realpath mkdir rm cp; do eval "$cmd() { replace_dot_args $cmd \"\$@\"; }" done
3. 生效方法
添加完上述代码后,执行以下命令让配置立即生效:
source ~/.bashrc
之后你就可以直接使用cd ...、ls ...、realpath ...等命令,...会自动被替换为../..。
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

