質問: ### 前提・実現したいこと #### 前提 Shellスクリプト で Uninstall.sh を作成しています。 インストールで入力したPATHを削除したいと考えています。 PATHは、「.bash_profile」の最下部に入力されています。 下記がインストール時のコマンドです。 ``` $ echo 'export PATH=$PATH:$HOME/.origin/bin' >> ~/.bash_profile` ``` #### 実現したいこと 「.bash_profile」に、特定の文字を含む行があった場合、 その文字列を含む行を削除するコードを書きたいと思っております。 そのため、現在下記コードを書いてみました。 ``` path=`grep origin $HOME/.bash_profile` if [[ `grep origin $HOME/.bash_profile` ]] ; then sed -i "s/$path//g" source ~/.bash_profile else : fi ``` ### 発生している問題・エラーメッセージ 発生したエラーメッセージは、下記の通りです。 ``` sed: -e expression #1, char 37: unknown option to `s' ``` 恐らく、sed の条件式の中に半角スペースが混じってしまい、 エラーが出てしまっているのかと思っています。 ただ、PATHを外から消したいのですが、他の手段が思い付きません。 ### 試したこと * if [-z 〜〜]と変更してみましたが、ファイル名を対象としてしまったため、条件に引っ掻からず。 * sed -i "s/$path//g"のsオプションを消したりしましたが、できませんでした。
回答: あくまで個人的な意見ですが・・・ .bash_profileを自動変更するというならパターンマッチは極力「ガチガチ」に書いた方がよい気がします。質問者さんのコードですと、ユーザーが"origin"という文字列を含むような行を.bash_profileに書いていた場合それを消してしまうため、場合によって致命的な結果を招くのではないかと思います。 せめてインストール時に追加した行に完全に一致するもののみを削除した方が多少なりとも安心できる気がします。もしsedで削除するなら以下のように行全体のパターンを指定することになります。 `sed -i.bak '/^export PATH=$PATH:$HOME\/\.origin\/bin$/d' ~/.bashrc` grepした結果だとどんなパターンになるか不明なのでどうやって特定の文字をエスケープするかについて考えないといけませんが、固定パターンであればかえって指定は容易になりますね。 ちなみに、インストール時に自動追加した部分は1文字でも変更されると困るので `# 自動生成スクリプト: 以下の行は編集しないでください` 風のコメントも追加したい気もします。それをやってしまうと連続した複数行のパターンマッチをしなくてはなりませんが・・・