ネストしたシェルスクリプトのエスケープ方法


サービスの起動コマンドで以下の処理を行いたくて

[code]

    for e in $(conda env list | grep mlflow | awk '{ print $1 }')
    do
      echo "conda env remove -n $e"
      conda env remove -n $e
    done
    
[/code]

というコマンドを bash -c の中に入れたいんですがうまくエスケープできません

[code]

    /bin/bash -c "source /home/ec2-user/.bash_profile; \
      for e in $(conda env list | grep mlflow | awk '{ print $1 }') \
      do \
        echo 'conda env remove -n $e' \
        conda env remove -n $e \
      done"
    
[/code]

[code]

    /bin/bash -c 'source /home/ec2-user/.bash_profile; \
      for e in $(conda env list | grep mlflow | awk \'{ print $1 }\') \
      do \
        echo "conda env remove -n $e" \
        conda env remove -n $e \
      done'
    
[/code]

あたり試したのですが  
どちらも  
`env: -c: line 4: syntax error: unexpected end of file`  
というエラーになってしまいます

* * *
[code]

    command=/bin/bash -l --'EOF'
      for e in $(conda env list | grep mlflow | awk '{ print $1 }')
      do
        echo "conda env remove -n $e"
        conda env remove -n $e
      done
    EOF
    
[/code]

と書いてみましたが

[code]

    Source contains parsing errors: 
    [line  9]: 'EOF\n'
    
[/code]

となってしまいます




awk をやめれば内側で ' が必要なくなって全体を ' でかこめるんじゃないですか？  
例えばこんな感じとか

[code]

    command=/bin/bash -l -c '
      conda env list | grep mlflow | while read e p
      do
        echo "conda env remove -n ${e}"
      done'
    
[/code]




無理してエスケープせずにheredocを `/bin/bash` に食わせてはどうですか。

[code]

    /bin/bash -l -- <<'EOF'
    for e in $(conda env list | grep mlflow | awk '{ print $1 }')
    do
      echo "conda env remove -n $e"
      conda env remove -n $e
    done
    EOF
    
[/code]

`<<'EOF'` のようにシングルクォートでくくれば変数は展開されません。

`-l` でログインシェルになるので `~/.bash_profile` を読むようになります。

