linux /usr/local/bin中的Shell脚本不工作,除非在使用前在终端中显式获取

zlwx9yxi  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(139)

我在/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中的任何脚本或二进制文件都能正常工作,而不需要为每个终端会话提供源代码。

luaexgnf

luaexgnf1#

我发现这个问题后不久发布了这个。所有的代码都在一个函数里面,它从来没有被调用过。当我获取文件的源代码时,它可以工作,因为函数进入了我当前shell的本地范围。我删除了函数 Package 器,并将其作为原始代码放入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()。
编辑:
感谢Gordon的评论,我找到了如何保持它是一个函数并正确调用它的方法。我不应该将函数命名为与脚本相同的名称,并且我学会了如何正确地调用函数并将参数从脚本调用传递给函数。

#!/bin/sh
extractfunc() {
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
}
extractfunc "$@"


不同之处在于,我将函数重命名为extractfunc(),并使用extractfunc "$@"调用它,因此调用脚本时的所有参数都将传递给函数调用。

相关问题