我想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
多变的是一个数组,它自动与 中的冒号分隔字符串同步PATH
。print -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[^:]*"