現在のユーザーに書き込み権限を持つPATHディレクトリを一覧表示しますか?

現在のユーザーに書き込み権限を持つPATHディレクトリを一覧表示しますか?

PATH私(現在のユーザー)に書き込み権限があるディレクトリからのみコンテンツを抽出できますか?

似たようなことが必要だと想像できますが、echo $PATH | grep...何なのかわかりません。

答え1

コロンで区切って次に$PATH変更します。IFSコロンでフィールドを分割期間単語拡張、以下を使用して各コンポーネントに書き込むことができることを確認します。-wテスト:

(IFS=:; for p in $PATH; do [ -w "$p" ] && printf '%s\n' "$p"; done)

これは空の項目を無視します(現在のディレクトリ)ワイルドカードを含むアイテムには間違った結果が得られます(Billyおじさんが指摘したように)。両方を処理するには、次を使用します。

sh -fc 'IFS=:; for p in $PATH""; do [ -w "${p:-.}" ] && printf "%s\n" "$p"; done'

答え2

zsh(配列に関連する$PATH$path

writable_path_components=( $^path(N-/e['[[ -w $REPLY ]]']) )

writable_path_components$PATH現在ユーザーが書き込むことができるディレクトリコンポーネント(シンボリックリンクの確認後に決定されます)は配列に保存されます。

空の要素は削除されます。$PATH空の要素や重要な相対パスを使用しないことをお勧めします。

相対パスを含めると、$PATHそのうちのいくつかは今書くことができますが、他の場所でCDを使用するとそれ以上書くことができないことを意味します。

$PATHすべての相対パスと重複エントリをクリーンアップして削除するには、次の手順を実行できます。

typeset -U path=( ${(M)path:#/*} )

プロパティをUon $path(ここではまだ関連しています$PATH)に設定すると、$PATHその要素は一意に保たれます。

答え3

これがあなたができることですxonsh

import os;[p for p in $PATH if os.access(p, os.W_OK)]

書き込み可能なパスのリストを返します。

関連情報