以交互模式运行在脚本中调用的其他脚本

时间:2020-10-27 13:41:22

标签: bash shell

TLDR

$ docker ps 
Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ alias docker="sudo docker"

$ cat script1.sh
docker ps
./script2.sh

$ cat script2.sh
docker image ls

$ bash -i script1.sh  # call in interactive mode so that aliases could expand 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?

如何使第一个脚本调用的其他脚本也以交互模式运行 ,而无需实际更改脚本
不更改脚本的原因是,我只想在工作站上运行很多嵌套脚本。我想避免在每次进行git commit之前都要进行更改和恢复的麻烦。


用例
当我需要运行脚本时,有几种用例,其中一些命令需要sudo才能在我的工作空间中工作。因此,我正在寻找一种使它们运行而无需直接编辑脚本以在这些命令之前附加sudo的方法(因为该脚本调用了许多其他脚本)。

仅举几例:

  • 除非我使用sudo运行带有“任何docker”的脚本,否则它将无法工作。我知道我可以将用户添加到docker组以使其正常工作。
  • 另一个例子是当一些脚本需要带有sudo的python时(尽管这是一个坏习惯,原因是在Centos6中无法更改默认python版本的一些限制)。

我可以想到的一种方法是使脚本使用别名,但是由于别名仅在外壳是交互式的时才起作用,因此如果在被调用的脚本中调用了另一个脚本,则别名将不起作用。 /> 鉴于脚本保持不变,欢迎提出任何其他想法。

1 个答案:

答案 0 :(得分:0)

script1.sh

alias docker="sudo docker"
docker ps

script2.sh

. ./script1.sh # assumes sript1/script2 are in same dir
docker image ls
> bash -i script2.sh

如果您的要求比这更复杂,请随时提出,我可以提出另一个建议。