Linux如何从父目录执行bash脚本?

时间:2018-08-14 10:49:28

标签: linux bash perl

我有一个名为GenerateDTIPubSub的脚本,如果我使用终端(在同一文件位置打开的终端)从其文件位置调用它,则该脚本:

./ GenerateDTIPubSub --DTIFramePubSub

工作正常。

现在在上面的文件夹中时如何执行脚本? 示例:./cfg/GenerateDTIPubSub --DTIFramePubSub

哪个不起作用(提醒您我也在上面的文件夹中打开了终端)

edit:它执行但bash脚本执行,但是除非从其目录执行bash脚本(如果有此意义),否则找不到执行的perl脚本

./GenerateDTIPubSub --DTIFramePubSub然后,GenerateDTIPubSub调用DTIFramePubSub函数,该函数调用perl脚本,此路径可以正常工作

./cfg/GenerateDTIPubSub --DTIFramePubSub无效,找不到perl脚本

  

无法打开perl脚本“ Scripts / DTIPubSub.pl”:没有此类文件或目录

但是perl脚本的路径不会仅更改bash文件路径

3 个答案:

答案 0 :(得分:2)

要变通解决此问题,您可以使用以下方法:

( cd cfg; ./GenerateDTIPubSub --DTIFramePubSub )

parens创建一个子shell,以避免为perl进程以外的任何内容更改当前工作目录。


潜在的问题是GenerateDTIPubSub假定当前工作目录是脚本的目录。以下是有关解决方法的说明。

  1. 快速而肮脏的方法:

    添加以下内容:

    use FindBin qw( $RealBin );
    BEGIN { chdir($RealBin); }
    
  2. 更明智的方法:

    首先,添加以下内容:

    use FindBin qw( $RealBin );
    

    然后替换

    "Scripts/DTIPubSub.pl"
    

    使用

    "$RealBin/Scripts/DTIPubSub.pl"
    

    您可能需要在代码中进行多个类似的修复。

答案 1 :(得分:1)

似乎您必须(临时)更改当前工作目录,然后再调用脚本。您可以使用以下技术来做到这一点

cd cfg && ./GenerateDTIPubSub --DTIFramePubSub

答案 2 :(得分:0)

问题是基本脚本中的Perl脚本的路径需要更改为包含/cgf