在其工作文件夹中运行 Bash 脚本

在其工作文件夹中运行 Bash 脚本

我在 Bash 中完成了一个脚本,它在脚本所在的文件夹上运行一个文件,传递一些配置文件并在同一文件夹上输出日志。例如,这将是结构:

/home/user/application

里面有以下文件:

script.sh      # this would be the script to launch
executablefile # this would be the file to run, it's called by the script as "./executable", since it's not in $PATH
config.json    # a config file for the executable that is passed by the script using arguments
logfile        # A log file written by the script, redirecting all Standard and Error output to the log file using tee

因此,如果我将 CD 插入该文件夹并运行脚本,则一切正常。但是,如果我从另一个位置调用此脚本,它无法找到可执行文件,并且很可能会搜索配置并在调用它的位置输出日志文件。这不是我想要的。

那么我可以向 sh 脚本写入哪些更改。脚本启动时将脚本目录建立为工作目录的东西?

我的主要想法是编写一个 systemd 服务文件,将来会调用这个脚本。

谢谢。

答案1

您可以做两件事:

  1. 在脚本中使用绝对路径。即改变

    ./executablefile
    

    /home/user/application/executablefile
    
  2. 执行脚本时设置工作目录。你提到你想把它做成一个systemd单元。在这种情况下,您的服务部分可能如下所示:

    [Service]
    Type=forking
    ExecStart=/home/user/application/script.sh
    WorkingDirectory=/home/user/application
    

另请注意,很多时候,您在启动脚本中执行的操作可以由 systemd 完成。诸如环境变量、chrt或关联性之类的事情都可以在配置中完成,systemd从而无需启动脚本。

另外,将可执行文件移动到/usr/local/bin,为日志文件留出可写空间/var并将 json 移动到/etcor~/.config通常是很好的做法。如果您正在编译executablefile,请考虑使用命令行参数来指定logfileetcfile名称。

答案2

找不到可执行文件

您的 shell 使用以下命令查找其他命令路径变量。不过,将配置文件保留在可执行路径中并不是一个好的做法。

它无法找到可执行文件

如果你告诉它如何:它会的:

MYDIR=$( dirname ( realpath "$BASH_SOURCE[0]" ))
# Above gets the path of the current script, cleans it up and removes the 
# script filename and preceding '/'

"$MYDIR/executablefile" "$MYDIR/config.json" >> "$MYDIR/logfiles"

然而,通常的做法是将配置放在定义的位置(有关于此的约定)或将其作为命令行参数传递。

相关内容