この質問が聞こえるほど純粋ではないと思うという点から始めましょう。
何をすべきか:フォルダのPATH環境変数を確認してください。最初にあっても後であってもかまいません。フォルダが存在することを確認してください。
私の質問の例 - を試してみましょう/opt/gnome
。
シナリオ1:フォルダがPATHの先頭にありません。
# echo "$PATH"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
# echo "$PATH" | grep ":/opt/gnome"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
/var/opt/gnome
grepはコロンを捕捉しないように十分に具体的でなければなりません。
シナリオ2:フォルダはPATHの先頭にあります。
# echo "$PATH"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
# echo "$PATH" | grep "^/opt/gnome"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
私の問題は次のとおりです。このフォルダでコロンまたは行の先頭を検索する必要があります。私がやりたいことは、次の2つの角かっこ式の1つです。
# echo $PATH | grep "[^:]/opt/gnome"
# echo $PATH | grep "[:^]/opt/gnome"
しかし、[^
そして[:
それ自体の意味があります。したがって、上記の2つのコマンドは機能しません。
1つのコマンドで両方の場合をgrepする方法はありますか?
ベストアンサー1
PATH
ファイルで何かを探すのではなく、環境変数の内容を調べると、これはgrep
無効なツールです。シェルでこれを行う方が簡単で(より速く、おそらくより読みやすくなります)。
Bash、ksh、zshから:
if [[ :$PATH: = *:/opt/gnome:* ]]; then
: # already there
else
PATH=$PATH:/opt/gnome
fi
持ち運べる:
case :$PATH: in
*:/opt/gnome:*) :;; # already there
*) PATH=$PATH:/opt/gnome;;
esac
:$PATH:
;代わりに;を使用してください$PATH
。これにより、コンポーネントがの先頭または末尾にあっても、検索文字列内で常にコロンで囲まれます$PATH
。
ファイルの1行を検索する場合は、拡張正規表現(requireなどgrep -E
)を使用して(^|:)/opt/gnome($|:)
一致させることができますが/opt/gnome
、行の先頭またはコロンの後にある場合、および行の最後にある場合にのみ可能です。その後はコロンが続きます。