I want to use the script command to see my output both in the command line and also store it at the same time, as suggested here.
Now, I can do in my command line:
script
source activate foo
python my_file.py
exitQuite a hassle if I have to do this often, so I thought I would write a bash script that automatizes this. I tried to literally paste these commands into a command line file, but it would wait for input after script.
Instead, here's how I thought of implementing this in a bash script (such that I would just run the script and it would do it all:
#!/bin/bash
script ../output.txt -c ' /home/foo/anaconda3/condabin/conda activate myenv3 && python myfile.py'And this gives me a CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
Why am I not using directly "source activate foo" or ". activate foo" as I would usually do? Well, if I try that, I get bash: activate: No such file or directory
I understand that /bin/bash apparently is not configured to do this in Ubuntu -- what should be my way forward?
1 Answer
When you run commands with script -c, they are run in a noninteractive shell:
$ script ../output.txt -c 'echo "\$0 = $0 ; FLAGS = $-"'
Script started, file is ../output.txt
$0 = bash ; FLAGS = hBc
Script done, file is ../output.txtThe flags are different from the normal interactive shell (note the presence of the i flag):
$ echo "\$0 = $0 ; FLAGS = $-"
$0 = -bash ; FLAGS = himBHsAlthough noninteractive, non-login shells read your ~/.bashrc, they likely processes it differently. In particular, the default ~/.bashrc that would have been copied from /etc/skel when your account was created starts with:
# If not running interactively, don't do anything
case $- in *i*) ;; *) return;;
esacmeaning that any conda related content that you added at the end of your ~/.bashrc will not get executed (and sourcing ~/.bashrc again won't help).
I don't know much about conda, but assuming it is capable of being run in such a shell, then one possible workaround would be the following:
remove the conda related portion of your
~/.bashrcto a separate filesource that file from your
~/.bashrcto keep the existing behavior for your interactive shellsource that file (instead of
~/.bashrc) first in yourscript -c ' ... 'command