需要一种优雅的方法来重载由其他工具动态创建和调用的Bash脚本中的命令

问题描述 投票:-1回答:1

[关于如何在Bash中重载命令的很多文章,要么通过创建别名或函数,要么只是更改脚本本身或如何调用脚本;这些方法对我来说很有意义,但不适用于我要解决的问题。

在半导体行业中,通常使用EDA工具在Tcl解释器中提供API命令;就我而言,EDA工具会生成一个Bash脚本,然后通过一个API调用执行该脚本,因此我只能在脚本执行后访问该脚本,并且无法修改其调用方式,因为这是在后台进行的;也没有一种用于修改写入脚本的目标命令的受祝福方法。

使此问题进一步复杂的是,此脚本是由EDA工具在Singularity容器内生成和调用的;同样,被调用的命令位于另一个EDA工具容器中,因此此命令“ vsim”必须转换为对我们的工作负载管理器(slurm)的ssh调用。例:vsim <args>必须转换为:ssh <some-host> <ssh-options> "srun <srun-options> vsim <args>"

同样,在父外壳程序中设置别名或名为'vsim'的功能对我不起作用;别名/函数未被子进程继承(这对我来说很难接受)。我还尝试创建一个名为“ vlog”的符号链接,该链接指向静态调度程序脚本。我宁愿不要将分发程序的路径硬编码为文件路径;我宁愿使用变量,例如vlog -> .../<resource>/$VERSION/bin/dispatch_for_flows,但是符号链接不是动态的。

我认为我仍然应该使用symlink方法,而不是指向调度程序,而是指向一个包装程序,该包装程序执行到调度程序的内插路径的单行执行程序,但是我仍然不相信设置别名并不能解决问题。多年以来,我编写了Csh脚本,其中包含指向用户别名的完整命令路径。使用Bash时,即使在父Shell甚至在/ etc / profile中都使用了shopt'expanand_alias',别名似乎也从未被继承。我在这里想念什么?

有人能得到下面的例子吗?我希望脚本从父shell继承别名并执行而不会出现“找不到命令”错误,而无需修改脚本或调用方式。同样,在执行脚本之前,我无权访问该脚本,并且无法控制其调用方式。 bash是父shell,bash是脚本,并且我在操作系统上具有root用户访问权限,因此可以根据需要更改bash的版本(使用4.4.19(1)-release(x86_64-redhat-linux-gnu))

$ alias hello='echo world'
$ hello
world
$ shopt | grep expand_aliases
expand_aliases  on
$ cat test.bash
#!/usr/bin/bash
set -x
alias
shopt | grep expand_aliases
shopt -s expand_aliases
shopt | grep expand_aliases
hello

$ ./test.bash
+ alias
+ shopt
+ grep expand_aliases
expand_aliases  off
+ shopt -s expand_aliases
+ shopt
+ grep expand_aliases
expand_aliases  on
+ hello
./test.bash: line 7: hello: command not found
linux bash alias
1个回答
0
投票

有人可以得到下面的例子吗?

不,别名是不可能的-您不能导出别名。但是您可以导出函数。

$ hello() { echo world; }
$ export -f hello
$ ./test.bash
expand_aliases  off
expand_aliases  on
world
© www.soinside.com 2019 - 2024. All rights reserved.