在‘脚本’命令中使用“源”

在‘脚本’命令中使用“源”

我想使用脚本命令在命令行中查看我的输出并同时存储它,正如建议的那样这里

现在,我可以在命令行中执行:

script
source activate foo
python my_file.py
exit

如果我必须经常这样做,那就太麻烦了,所以我想编写一个 bash 脚本来自动执行此操作。我尝试将这些命令直接粘贴到命令行文件中,但它会等待输入script

相反,我是这样想的,在一个 bash 脚本中实现这个的(这样我只需运行该脚本,它就会完成所有操作):

#!/bin/bash
script ../output.txt -c ' /home/foo/anaconda3/condabin/conda activate myenv3 && python myfile.py'

这给了我一个CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.

为什么我没有像平常一样直接使用“source activate foo”或“.activate foo”?好吧,如果我尝试这样做,我会得到bash: activate: No such file or directory

我理解 Ubuntu/bin/bash显然没有配置这样做——我该怎么做?

答案1

当您使用 运行命令时script -c,它们将在非交互式壳:

$ script ../output.txt -c 'echo "\$0 = $0 ; FLAGS = $-"'
Script started, file is ../output.txt
$0 = bash ; FLAGS = hBc
Script done, file is ../output.txt

这些标志与正常的交互式 shell 不同(请注意标志的存在i):

$ echo "\$0 = $0 ; FLAGS = $-"
$0 = -bash ; FLAGS = himBHs

尽管非交互式、非登录 shell 会读取您的~/.bashrc,但它们的处理方式可能有所不同。具体来说,从您的帐户创建时~/.bashrc复制的默认设置以以下内容开头:/etc/skel

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这意味着您在末尾添加的任何与 conda 相关的内容~/.bashrc都不会被执行(并且~/.bashrc再次采购也无济于事)。

我不太了解 conda,但假设它能够在这样的 shell 中运行,那么一个可能的解决方法如下:

  • 删除与 conda 相关的部分~/.bashrc到一个单独的文件中

  • 从你的源文件来~/.bashrc保持你的交互式 shell 的现有行为

  • 在命令~/.bashrc中首先获取该文件(而不是)script -c ' ... '

相关内容