[解決済み] Bashで$PATH変数からパスを削除する最もエレガントな方法は何ですか?
質問
より一般的には、Bash 環境変数のコロンで区切られたリストから項目を削除するにはどうしたらよいでしょうか。
何年も前に、Bash の変数展開のより高度なフォームを使用して、これを行う簡単な方法を見たことがあると思ったのですが、もしそうなら、私はそれを見失っていました。 Google ですばやく検索すると、驚くほど少数の関連する結果が見つかり、私が単純またはエレガントと呼ぶものはありません。 例えば、sed と awk をそれぞれ使用する 2 つの方法です。
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
ストレートなものは存在しないのでしょうか? Bashのsplit()関数に相当するものはないのでしょうか?
更新しました。
私は特定のユースケースを解決することよりも、良い議論を引き起こすことに興味があったのですが、意図的に曖昧な質問をしたことを謝らなければならないようです。 幸いなことに、私はそれを得ました!
ここには、非常に巧妙なテクニックがあります。 最終的に、私は以下の 3 つの関数を私のツールボックスに追加しました。 魔法は path_remove で起こりますが、これは Martin York の巧妙な
awk
の RS 変数の巧みな使用に基づいています。
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
この中で唯一本当にくだらないのは
sed
を使用して、末尾のコロンを削除していることです。 しかし、Martin のソリューションの残りの部分がいかに簡単であるかを考えると、私はそれに耐えることができます!
関連する質問です。 シェルスクリプトで $PATH 要素を操作するにはどうしたらいいですか?
どのように解決するのですか?
awkで1分。
# Strip all paths with SDE in them.
#
export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'`
編集:以下のコメントへの対応です。
$ export a="/a/b/c/d/e:/a/b/c/d/g/k/i:/a/b/c/d/f:/a/b/c/g:/a/b/c/d/g/i"
$ echo ${a}
/a/b/c/d/e:/a/b/c/d/f:/a/b/c/g:/a/b/c/d/g/i
## Remove multiple (any directory with a: all of them)
$ echo ${a} | awk -v RS=: -v ORS=: '/a/ {next} {print}'
## Works fine all removed
## Remove multiple including last two: (any directory with g)
$ echo ${a} | awk -v RS=: -v ORS=: '/g/ {next} {print}'
/a/b/c/d/e:/a/b/c/d/f:
## Works fine: Again!
セキュリティ問題への対応で編集:(質問とは関係ないことですが)
export PATH=$(echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}' | sed 's/:*$//')
これは、最後のエントリを削除することによって残った末尾のコロンを削除し、効果的に
.
をパスに追加することになります。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Pythonでパスから拡張子なしでファイル名を取得する方法は?
-
[解決済み] 好ましいBashのシェバングとは?
-
[解決済み] Bashで文字列から固定プレフィックス/サフィックスを削除する
-
[解決済み] シェル(BASH/ZSH/SH)でファイルの絶対パスを取得する方法を教えてください。
-
[解決済み】Bashスクリプトでクリップボードにパイプを接続する
-
[解決済み] Bashでコマンド出力を隠す方法
-
[解決済み] Makefileでシェルコマンドを使用する方法
-
[解決済み] 指定した名前のDockerコンテナが存在しない場合のみ、Bashコマンドを実行するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PATH変数から冗長なパスを削除する
-
[解決済み] シェル - 変数の内容をファイルに書き出す
-
[解決済み] Bashでユーザの入力を変数に読み込むには?
-
[解決済み] bashのループリストで空白をエスケープするには?
-
[解決済み] Bashで引用符で囲まれた文字列の中で環境変数を使用する方法
-
[解決済み] bashのタブ補完はどのように機能するのですか?
-
[解決済み] Makefileでシェルコマンドを使用する方法
-
[解決済み] bashで端末の最終行を削除して置換するには?
-
[解決済み] Docker: 実行中のDockerコンテナの停止と削除
-
[解決済み] bash で文字列をエスケープするコマンド