如何在bash脚本

时间:2016-03-23 07:48:46

标签: bash

我只是在学习bash,但是我制作的剧本正在运行(尽管结果不大,却为此感到自豪)除了一个小细节:

我写了一个bash脚本,最后应该执行一个程序。这个程序在我的环境变量中是已知的,所以当我写这行时:

my_program -b result.dat

程序直接以结果文件作为输入执行(并以批处理模式)。

我想在我的脚本结束时执行这个程序,所以我只需执行我的脚本,让它进行计算,最后用一些选项执行my_program

#!/bin/bash

#calculations

my_program result.dat 

经过一番搜索,我找到了一个适合

的命令
eval my_program

env my_program

source my_program

bash my_program

每次结果都相同

=> my_program: command not found 

=> my_program: no such file or directory 

有什么办法吗?

提前感谢你的时间

修改

我可以编写my_program的整个路径(它可以工作),但我正在寻找一种可以在另一台可以有另一条路径的计算机上运行的解决方案。

我的想法是知道程序的名称,脚本可以搜索环境变量并检索程序的路径。可以这样做吗?

最佳解决方案 - 由zezollo

  • 在每台计算机中查找程序路径以设置它是$ PATH需要花费太多时间
  • 手动放置" my_program"建议使用$ PATH变量中的路径
  • 手动放置" my_program" .bashrc中的路径甚至更好,因为它将保留每次执行

1 个答案:

答案 0 :(得分:0)

正确设置$PATH

执行所需操作的最佳方法是正确设置$PATH,例如要在my_program中列出包含$PATH的目录。

要查看$PATH的内容,只需在控制台中输入echo $PATH即可。

要将一个或多个目录添加到$PATH,您可以键入控制台:

$ export PATH=/home/one/more/path/:/yet/another/path/:$PATH

但这只适用于您当前的控制台会话。

您确实希望每次启动新控制台时都将此$PATH设置为相同:然后您可以将此相同的行添加到您自己的配置文件中的.bashrc文件中。

当然,您必须在要使用程序的每台计算机上设置$PATH。但我会选择这个解决方案,因为它完全属于正常的安装方式。程序的过程:如果你想从另一个脚本调用程序,你最好告诉另一个脚本你的程序在哪里。设置$PATH是一种直接的方法。

正确设置$PATH后,您的脚本只需直接调用my_programm -b my_file,无需evalsource或其他任何内容。

使用find

现在,假设您不知道您的计划在哪里,并且您不想在每台计算机上正确设置$PATH,并且my_program的完整路径各不相同计算机(你确定没有其他解决办法吗?这种情况必须有一个很好的理由,因为只有1或2个不同的可能目录应该足够,并且可以通过设置$PATH轻松修复正确地)。

当然,您可以随时find您的计划。但它并不是一个很好的解决方案。

可能是这样的:

full_path=`find /home/$USER -nowarn -name my_program 2> /dev/null`

但这意味着:

  • 您确定不会有多行输出(这就是为什么我添加-nowarn2> /dev/null以避免警告并在stderr上重定向可能的输出的原因到/ dev / null,但是如果my_program存在两次,例如?)。或者您也可以过滤find的输出(仅限第一行)。但这确实是一个补丁工作。

  • 即使您只在/home/$USER中查找my_program,它也会很慢,如本例所示。解决方法可能是将此命令的结果存储在文件中,并读取此文件的内容(如果不为空),以便仅运行一次find命令。但是,只有正确设置$PATH才能轻松解决这一问题。

最后

另外,不要忘记给my_program执行权限,否则,你根本无法执行它。