【问题标题】:sourcing specific function in bash not working在 bash 中采购特定功能不起作用
【发布时间】:2017-10-13 09:29:29
【问题描述】:

我正在尝试获取 bash 文件的特定功能。 请在下面找到简化的 loadfun.sh :-

function a(){
        echo "This is a"
}

function b(){
        echo "This is b"
}

function load(){
        echo "exporting $1"
        export -f $1
}

$@

另外,请查看以下命令的执行顺序:-

$cat loadfun.sh                             
function a(){                               
        echo "This is a"                    
}                                           

function b(){                               
        echo "This is b"                    
}                                           

function load(){                            
        echo "exporting $1"                 
        export -f $1                        
}                                           

$@                                          
$                                           
$                                           
$                                           
$sh loadfun.sh a                            
This is a                                   
$                                           
$                                           
$a                                          
bash: a: command not found                  
$                                           
$                                           
$sh loadfun.sh load a                       
exporting a                                 
$                                           
$                                           
$                                           
$a                                          
bash: a: command not found                  
$                                           

我不知道为什么

导出-f a

没有导出函数a。

【问题讨论】:

  • 当您运行sh command... 时,它会创建一个新的子进程并在其中运行sh。我认为导出适用于这个子进程,但不适用于您的 shell。这似乎相关:stackoverflow.com/questions/16618071/…
  • Export 仅使子进程可用。子进程不能改变父环境。
  • (而sh yourscript 甚至没有运行 bash ——它正在运行 /bin/sh,这不能保证完全支持函数导出;所以即使您希望在使用导出函数的进程是sh yourscript 的子进程,但仍不能保证它存在)。
  • 不过,要理解的重要一点是,export 将变量作为函数执行相同的操作——它使该变量可用于当前 shell 的子进程我>。不是父母——即。启动 shell 的东西——更确切地说,进程 shell 启动。
  • (顺便说一句——裸$@ 与运行$* 有完全相同的错误。始终使用"$@" 代替;这是shellcheck.net 会发现的问题)。

标签: bash function


【解决方案1】:

如果您只想在获取文件时设置特定功能,那么您可以使用 case 语句

case $1 in   
a)
        a(){
                echo "This is a"
        }
;;
b)
        b(){
                echo "This is b"
        }
;;
*)
        echo error message
;;
esac

并调用脚本

. ./script [function to export]

【讨论】:

  • 嗯?该函数根本没有被导出(对子进程可用);它只定义在直接的 shell 中。
  • @CharlesDuffy 从 cmets 和标题来看,我认为这就是他们真正想要的。
  • 如果标题或评论有误导性,我很抱歉。我希望导出函数 a 而不是方法 a。
  • @mogli:如果“导出”是指“在当前外壳中可用”(选择性地,按需),那么这正是这个答案所提供的。函数的真正导出——因此它们成为子进程环境的一部分——是特定于 Bash 的概念,只有同时也是 Bash shell 的子进程才会尊重它们。
【解决方案2】:

获取您的脚本而不是执行它,以便定义和 export 在您当前的 shell 中发生:

source loadfun.sh a

顺便说一句——.sh 扩展名具有误导性;因为它使用 bash-only 功能,所以它应该被命名为loadfun.bash。 (对于 executable 脚本,通常不赞成使用扩展,但由于它旨在作为库加载,因此扩展是合适的)。

【讨论】:

  • 这也会加载 b 函数
  • 确实如此,但它只导出 a 函数。
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多