62112


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

[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]

となってしまいます


CC BY-SA 4.0
2020-01-08T11:56:11.697
62070
2020-01-09T15:25:48.143
2020-01-09T03:43:56.953
question
bash shellscript
ネストしたシェルスクリプトのエスケープ方法


無理してエスケープせずに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` を読むようになります。


CC BY-SA 4.0
2020-01-08T14:22:24.950
62075
2020-01-09T10:25:38.327
2020-01-09T10:25:38.327
62
62
62070
answer


`''` で囲めばいいのですが、注意すべき点があります。

  * `''` の中では `\` も単なる文字でしかなくなるので、エスケープする手段がなくなる
  * 従って、囲った中に `'` を含めることができない

では `'` をどうしたらいいかと言うと、

  * 一旦 `'` で閉じる
  * `'` を単なる文字として書く
  * 再び `'` を開く

とします。

`'` を単なる文字として書くには、主に2つの方法があって、`\'` のようにエスケープするか、`"'"` のように `""`
で囲みます。エスケープする方法は metropolis さんのコメントにあるので、私は `""` で囲む方法で書いてみました。

[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]


CC BY-SA 4.0
2020-01-08T17:03:11.863
62079
2020-01-08T17:03:11.863
5288
62070
answer


metropolisさんのコメントどおり書いてみてはいかがでしょうか。

[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]

    '\''
    
[/code]

※実機で試していませんがこれでいけるはずです。


CC BY-SA 4.0
2020-01-09T11:17:32.420
62104
2020-01-09T11:17:32.420
35558
62070
answer


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]


CC BY-SA 4.0
2020-01-09T15:25:48.143
62112
2020-01-09T15:25:48.143
62070
answer