如何从 PATH 中一次性提取所有 bin 目录?

如何从 PATH 中一次性提取所有 bin 目录?

我想bin从中提取所有目录PATH并将其设置为变量。我很困惑,因为所有目录都出现在一行中,:但我只想要这些bin目录。

/home/jo52900/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/local/bin:/opt/universal/ucmdmgr/bin

我该怎么做?

答案1

我不知道你为什么要bin特别对待这些目录,我猜你只是想在自己的行上查看每个目录。如果是这样,你可以这样做:

printf '%s\n' "$PATH" | tr : '\n'

例如,在我的系统上,我有许多$PATH名称不包含的目录bin,这给出了:

$ printf '%s\n' "$PATH" | tr : '\n' 
/home/terdon/perl5/bin
/home/terdon/Setups/cd-hit-v4.5.4-2011-03-07
/sbin
/usr/local/sbin
/usr/bin
/usr/sbin
/home/terdon/Setups/PfamScan
/home/terdon/research/data/python
/home/terdon/scripts
/home/terdon/bin

如果您真的只想查看bin目录,可以提取它们:

$ printf '%s\n' "$PATH" | tr : '\n' | grep '/bin$'
/home/terdon/saphetor/bin
/home/terdon/perl5/bin
/usr/bin
/home/terdon/bin

或者,如果您想做您在答案中显示的操作,并且还包括bin在其名称中的任何位置包含该字符串的任何目录,而不仅仅是那些实际存在的目录命名的 bin, 你可以做:

$ printf '%s\n' "$PATH" | tr : '\n' | grep 'bin'
/home/terdon/saphetor/bin
/home/terdon/perl5/bin
/sbin
/usr/local/sbin
/usr/bin
/usr/sbin
/home/terdon/bin

答案2

另一种方法是要求 shell 进行分割$PATH

( IFS=: ; printf "%s\n" $PATH )

grep您可以根据需要对此进行后处理。

答案3

假设您正在使用 zsh:

print -lr $path

path多变的是一个数组,它自动与 中的冒号分隔字符串同步PATHprint -lr每行打印一个元素,而不进行反斜杠解释1。

如果您需要其他一些没有绑定数组的冒号分隔列表,您可以通过参数扩展标志

print -lr ${(s[:])LD_LIBRARY_PATH}

我不知道“bin目录”是什么意思。您可以使用 grep 进行过滤,例如

print -lr $path | grep bin

或者使用参数扩展特征,例如

print -lr ${(M)path:#*bin*}

1对于挑剔者:这假设列表不为空并且第一个元素不以 开头-。这是一个安全的赌注$path

答案4

我找到了解决方案

echo "$PATH" | grep -o "[^:]*bin[^:]*"

相关内容