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