我在/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
。my /bin/sh链接到dash。
我希望/usr/local/bin中的任何脚本或二进制文件都能正常工作,而不需要为每个终端会话提供源代码。
1条答案
按热度按时间luaexgnf1#
我发现这个问题后不久发布了这个。所有的代码都在一个函数里面,它从来没有被调用过。当我获取文件的源代码时,它可以工作,因为函数进入了我当前shell的本地范围。我删除了函数 Package 器,并将其作为原始代码放入shell脚本中。
字符串
现在一切正常我想知道是否有一种方法来保持这一功能?我想我将测试一下是否可以在脚本的末尾调用extract()。
编辑:
感谢Gordon的评论,我找到了如何保持它是一个函数并正确调用它的方法。我不应该将函数命名为与脚本相同的名称,并且我学会了如何正确地调用函数并将参数从脚本调用传递给函数。
型
不同之处在于,我将函数重命名为
extractfunc()
,并使用extractfunc "$@"
调用它,因此调用脚本时的所有参数都将传递给函数调用。