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)
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
元素将保持唯一。