我在 /usr/local/bin 中有一个 shell 脚本
#!/bin/sh
extract() {
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
}
但是,除非我在当前终端中执行
source /usr/local/bin/extract
,否则它无法正常运行。我知道 /usr/local/bin 在我的路径中。
我尝试将脚本的所有者更改为 root:root 以查看是否有影响。文件权限为 755。我尝试在 .zshenv 中再次获取 /usr/local/bin 的源代码,但无论如何它已经在 $PATH 中了。我可以让它工作的唯一方法是直接使用
source /usr/local/bin/extract
。我尝试过在进行这样的各种更改后重新启动。我在 shellcheck 中检查了文件中的 bashisms。我尝试了不同的 shebangs,#!/usr/bin/env bash
和 #!/bin/sh
。我的 /bin/sh 链接到 dash。
我希望 /usr/local/bin 中的任何脚本或二进制文件都可以工作,而无需为每个终端会话获取它。
发布此内容后不久我就意识到了这个问题。所有代码都在函数内部,并且从未被调用。当我获取文件时它起作用了,因为该函数进入了我当前 shell 的本地范围。我删除了函数包装器并将其作为原始代码放入 shell 脚本中,例如
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
现在效果很好。我想知道是否有办法保持这个功能?我想我会测试一下是否可以在脚本末尾调用 extract() 。