我只是在学习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
答案 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
,无需eval
或source
或其他任何内容。
现在,假设您不知道您的计划在哪里,并且您不想在每台计算机上正确设置$PATH
,并且my_program
的完整路径各不相同计算机(你确定没有其他解决办法吗?这种情况必须有一个很好的理由,因为只有1或2个不同的可能目录应该足够,并且可以通过设置$PATH
轻松修复正确地)。
当然,您可以随时find
您的计划。但它并不是一个很好的解决方案。
可能是这样的:
full_path=`find /home/$USER -nowarn -name my_program 2> /dev/null`
但这意味着:
您确定不会有多行输出(这就是为什么我添加-nowarn
和2> /dev/null
以避免警告并在stderr上重定向可能的输出的原因到/ dev / null,但是如果my_program存在两次,例如?)。或者您也可以过滤find
的输出(仅限第一行)。但这确实是一个补丁工作。
即使您只在/home/$USER
中查找my_program,它也会很慢,如本例所示。解决方法可能是将此命令的结果存储在文件中,并读取此文件的内容(如果不为空),以便仅运行一次find
命令。但是,只有正确设置$PATH
才能轻松解决这一问题。
另外,不要忘记给my_program执行权限,否则,你根本无法执行它。