列出当前用户有权写入的 PATH 目录?

Joã*_*ira 6 grep path

我可以PATH仅从我(当前用户)有权写入的目录中提取内容吗?

我可以想象我需要类似的东西echo $PATH | grep...,但我不知道是什么。

Ste*_*itt 12

$PATH在冒号上拆分,通过在单词扩展期间更改IFS在冒号上拆分字段,并检查是否可以使用测试写入每个组件:-w

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

这将忽略空条目(代表当前目录),并对包含通配符的条目给出不正确的结果(如比利叔叔所指出的)。要处理两者,请使用

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


Sté*_*las 6

With zsh(其中$PATH与数组相关$path):

writable_path_components=( $^path(N-/e['[[ -w $REPLY ]]']) )
Run Code Online (Sandbox Code Playgroud)

writable_path_components将在数组中存储$PATH当前用户可写的目录组件(在符号链接解析后确定)。

空元素将被丢弃。强烈建议不要使用空元素或任何重要的相对路径$PATH

如果$PATH包含相对路径,则意味着虽然其中一些现在可能是可写的,但一旦您在其他地方进行 cd 操作,它们可能就不再是可写的。

要清理$PATH并删除所有相对路径以及重复项,您可以执行以下操作:

typeset -U path=( ${(M)path:#/*} )
Run Code Online (Sandbox Code Playgroud)

将属性设置U为 on $path(此处仍与 相关$PATH),意味着$PATH元素将保持唯一。

  • @João,您的错误消息表明您正在使用 bash,而不是 zsh。 (4认同)