/usr/local/bin 中的 Shell 脚本无法工作,除非在使用前在终端中明确获取来源

问题描述 投票:0回答:1

我在 /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 中的任何脚本或二进制文件都可以工作,而无需为每个终端会话获取它。

linux bash sh zsh archlinux
1个回答
0
投票

发布此内容后不久我就意识到了这个问题。所有代码都在函数内部,并且从未被调用。当我获取文件时它起作用了,因为该函数进入了我当前 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() 。

© www.soinside.com 2019 - 2024. All rights reserved.