自定义fresh函数执行时报‘无此文件或目录’错误求助
问题
我在~/.bash_aliases中定义了如下fresh函数:
function fresh() { if [ $# -eq 0 ] ; then # If no params added, source both bash_aliases and aliases.zsh "cp $HOME/.bash_aliases $ZSH_CUSTOM/aliases.zsh; source $HOME/.bash_aliases $ZSH_CUSTOM/aliases.zsh; echo 'Aliases Refreshed (Bash + Zsh).'" return 0 fi CMD=$1 shift case $CMD in b|bash) # Source bash_aliases (only) "source $HOME/.bash_aliases; echo 'Aliases Refreshed (Bash).'" ;; z|zsh|zash) # Source aliases.zsh (only) "source $ZSH_CUSTOM/aliases.zsh; echo 'Aliases Refreshed (Zsh).'" ;; esac return $? }
该函数的设计逻辑:
- 无参数时:将
~/.bash_aliases复制到$ZSH_CUSTOM/aliases.zsh,然后加载这两个文件 - 传入
b/bash参数:仅加载bash别名文件 - 传入
z/zsh/zash参数:仅加载zsh别名文件
原本这套逻辑作为别名时可正常工作,但改成函数后执行报错:
fresh:4: no such file or directory: cp /home/scott/.bash_aliases /home/scott/.oh-my-zsh/custom/aliases.zsh; source /home/scott/.bash_aliases /home/scott/.oh-my-zsh/custom/aliases.zsh; echo 'Aliases Refreshed (Bash + Zsh).'
直接复制函数内的命令单独执行是正常的,也能通过cat $ZSH_CUSTOM/aliases.zsh确认修改生效。请问为何会报“无此文件或目录”错误?是否需要先切换目录?
原因与解决方法
错误原因
你在函数里把整串命令用双引号包裹了,shell会把这一整串内容当成单个命令/文件名去查找,而不是解析成多条命令依次执行。
别名的工作机制是:别名本身是一个字符串,调用时shell会替换成对应字符串再解析执行命令;但函数里直接用双引号包裹命令串,shell会将其视为一个整体,自然找不到这个“超长文件名”的命令,因此报错“无此文件或目录”。
解决方法
去掉命令串外面的双引号,直接编写命令即可。函数内部的代码会被shell逐行解析执行,多条命令用分号分隔或换行写都可以。
修正后的函数代码(额外给路径变量加了双引号,避免路径含空格时出错):
function fresh() { if [ $# -eq 0 ] ; then # If no params added, source both bash_aliases and aliases.zsh cp "$HOME/.bash_aliases" "$ZSH_CUSTOM/aliases.zsh"; source "$HOME/.bash_aliases" "$ZSH_CUSTOM/aliases.zsh"; echo 'Aliases Refreshed (Bash + Zsh).' return 0 fi CMD=$1 shift case $CMD in b|bash) # Source bash_aliases (only) source "$HOME/.bash_aliases"; echo 'Aliases Refreshed (Bash).' ;; z|zsh|zash) # Source aliases.zsh (only) source "$ZSH_CUSTOM/aliases.zsh"; echo 'Aliases Refreshed (Zsh).' ;; esac return $? }
内容的提问来源于stack exchange,提问作者J. Scott Elblein
相关产品推荐
相关产品推荐

