daily bug report

这是一个日常记录blog

记录每天遇到的各种bug的流水账

定期会把其中可分类的部分分离出来

2021-03-16

复现

在腾讯云服务器的docker container中执行shell脚本sh activateEnv.sh时,执行其中的 conda activate env_name,出现了CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. 的报错。

shell脚本

1
2
3
4
#!/bin/bash

cd ~/brl_checkIn/back_end/
conda activate brl_checkIn

解决

不使用sh *.sh执行shell脚本,使用. *sh或者source *.sh执行脚本。

分析

几种shell脚本执行方法

使用 sh test.sh 执行

使用 sh test.sh 来执行 script 文件,该方法标明使用 sh 这种 shell 来执行 test.sh 文件,sh 已经是一种被 bash 替代的 shell,尽管我们在 test.sh 中声明使用 #!/bin/bash 来执行我们的文件,但此时使用 sh 而不是 bash,则#!/bin/bash 已不起作用。

使用 bash test.sh 执行

该方法其实与 sh test.sh 的原理一样,只是使用了 /bin/bash 该种 shell 来执行我们的脚本文件。

所以,其实使用 dash test.sh 也是可以的,只是取决于自己想使用那种 shell 来执行脚本,但 sh、bash、dash 三者有些许差别,bash对于部分关键字如 let,bash 支持,而 sh 和 dash 并不支持。

使用 . test.sh 执行

该种方式使用之前必须为文件添加执行的权限:

1
$ chmod +x test.sh

添加完执行权限之后,便可以使用 ./test.sh 来执行脚本,该方式与 bash test.sh 是一样的,默认使用 bin/bash 来执行我们的脚本。只有该种执行方式需要对文件添加执行权限,其他方式并不需要。

使用 source test.sh执行

source 方法执行脚本是在父进程中执行的,以上三种方法是在shell子进程中执行的。test.sh 的各项操作都会在原本的 shell 内生效,这也是为什么不注销系统而要让某些写入~/.bashrc 的设置生效时,需要使用 source ~/.bashrc 而不能使用 bash ~/.bashrc


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!