João Pimentel Ferreira Asked: 2021-12-10 06:56:06 +0800 CST2021-12-10 06:56:06 +0800 CST 2021-12-10 06:56:06 +0800 CST 列出当前用户有权写入的 PATH 目录? 772 PATH我可以仅从我(当前用户)有权写入的目录中提取吗? 我可以想象我需要类似的东西,echo $PATH | grep...但我不知道是什么。 grep path 3 个回答 Voted Best Answer Stephen Kitt 2021-12-10T06:58:39+08:002021-12-10T06:58:39+08:00 通过在单词扩展期间$PATH更改IFS为冒号上的拆分字段来拆分冒号,并检查您是否可以使用test写入每个组件:-w (IFS=:; for p in $PATH; do [ -w "$p" ] && printf '%s\n' "$p"; done) 这将忽略空条目(代表当前目录),并且会为包含通配符的条目给出不正确的结果(正如比利叔叔所指出的)。要同时处理这两种情况,请使用 sh -fc 'IFS=:; for p in $PATH""; do [ -w "${p:-.}" ] && printf "%s\n" "$p"; done' Stéphane Chazelas 2021-12-10T09:22:58+08:002021-12-10T09:22:58+08:00 使用zsh($PATH与$path数组绑定的位置): writable_path_components=( $^path(N-/e['[[ -w $REPLY ]]']) ) 将在writable_path_components数组中存储$PATH作为目录(在符号链接解析后确定)并且可由当前用户写入的组件。 空元素被丢弃。$PATH强烈建议不要使用空元素或任何相关路径。 如果$PATH包含相对路径,这意味着虽然其中一些现在可能是可写的,但一旦您在其他地方 cd,它们可能不再是可写的。 要清理$PATH和删除所有相对路径以及重复项,您可以执行以下操作: typeset -U path=( ${(M)path:#/*} ) 将U属性设置为 on $path(此处仍与 绑定$PATH),意味着$PATH元素将保持唯一。 Fynn 2021-12-11T06:25:44+08:002021-12-11T06:25:44+08:00 这就是你可以做到的方式xonsh import os;[p for p in $PATH if os.access(p, os.W_OK)] 返回可写的路径列表。
通过在单词扩展期间
$PATH
更改IFS
为冒号上的拆分字段来拆分冒号,并检查您是否可以使用test写入每个组件:-w
这将忽略空条目(代表当前目录),并且会为包含通配符的条目给出不正确的结果(正如比利叔叔所指出的)。要同时处理这两种情况,请使用
使用
zsh
($PATH
与$path
数组绑定的位置):将在
writable_path_components
数组中存储$PATH
作为目录(在符号链接解析后确定)并且可由当前用户写入的组件。空元素被丢弃。
$PATH
强烈建议不要使用空元素或任何相关路径。如果
$PATH
包含相对路径,这意味着虽然其中一些现在可能是可写的,但一旦您在其他地方 cd,它们可能不再是可写的。要清理
$PATH
和删除所有相对路径以及重复项,您可以执行以下操作:将
U
属性设置为 on$path
(此处仍与 绑定$PATH
),意味着$PATH
元素将保持唯一。这就是你可以做到的方式
xonsh
返回可写的路径列表。