/usr/local/bin下Shell脚本需手动source才可运行的问题求助
问题原因与解决办法
核心原因
你当前的脚本是在定义shell函数,而非编写独立可执行程序:
- 直接运行脚本时,它会在子shell中执行,函数仅在该子shell内生效,执行完毕子shell退出,当前终端的shell环境无法获取这个函数。
- 只有通过
source(或.)执行脚本时,脚本才会在当前shell进程中运行,函数才会被加载到当前环境,所以你必须手动source才能使用。
解决办法(二选一)
办法1:将脚本改为独立可执行程序
修改脚本内容,移除函数定义extract() { ... }的包裹,直接保留逻辑代码:
#!/bin/sh if [ -z "$1" ]; then # display usage if no parameters given echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>" elif [ -f "$1" ]; then case $1 in *.tar.bz2) tar xvjf "$1" ;; *.tar.gz) tar xvzf "$1" ;; *.tar.xz) tar xvJf "$1" ;; *.lzma) unlzma "$1" ;; *.bz2) bunzip2 "$1" ;; *.rar) unrar x "$1" ;; *.gz) gunzip "$1" ;; *.tar) tar xvf "$1" ;; *.tbz2) tar xvjf "$1" ;; *.tgz) tar xvzf "$1" ;; *.zip) unzip "$1" ;; *.Z) uncompress "$1" ;; *.7z) 7z x "$1" ;; *.xz) unxz "$1" ;; *.exe) cabextract "$1" ;; *) echo "extract: '$1' - unknown archive method" ;; esac echo "extraction successful: $1" else echo "$1 - file does not exist" fi
保存后确保权限为755(执行chmod 755 /usr/local/bin/extract),之后直接在终端输入extract <归档文件>即可执行,无需source。
办法2:让函数自动加载到终端会话
若想保留函数形式,可将函数配置到shell的启动文件中,实现自动加载:
- 对于zsh:将函数内容添加到
~/.zshrc或~/.zshenv文件末尾;或者在上述文件中添加一行source /usr/local/bin/extract - 对于bash:将函数内容添加到
~/.bashrc或~/.bash_profile文件末尾;或者添加一行source /usr/local/bin/extract
修改后重启终端,即可直接使用extract函数,无需手动source。
内容的提问来源于stack exchange,提问作者Brandon Johnson
相关产品推荐
相关产品推荐

