以易于理解的方式显示PATH


43

我想以更易于理解的方式显示PATH环境变量。

$ echo $PATH
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin:/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin:/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin:/Users/arturo/.rvm/bin:/usr/local/git/bin:/Users/arturo/.gvm/groovy/current/bin:/Users/arturo/.gvm/grails/current/bin:/Users/arturo/.gvm/griffon/current/bin:/Users/arturo/.gvm/gradle/current/bin:/Users/arturo/.gvm/lazybones/current/bin:/Users/arturo/.gvm/vertx/current/bin:/Users/arturo/.gvm/bin:/Users/arturo/.gvm/ext:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin

我在想这样的事情:

$ echo $PATH | some cut and awk magic
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/bin
...

Answers:


62

您可以使用tr

$ tr ':' '\n' <<< "$PATH"
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...

您也可以在某些shell中进行此操作(在bash和zsh中测试):

echo -e ${PATH//:/\\n}

在zsh中,您可以使用$path变量查看带空格而不是冒号的路径。

$ echo $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin /Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin /Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin /Users/arturo/.rvm/bin

可以与printf或结合使用print

$ printf "%s\n" $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...
$ print -l $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...

<<<运营商称为herestrings。在这里,字符串将其右侧的单词传递到左侧命令的标准输入。

$ cat <<< 'Hello there'
Hello there

如果您的外壳不支持它们,请使用echo和管道。

$ echo 'Hello there' | cat
Hello there

2
有趣的是使用here-string,我将执行以下操作:echo $PATH | tr ':' '\n'但更清晰的解决方案。
Arturo Herrero 2013年

1
我在回答中加了一点,以解释对任何路人使用herestrings的方法。

在zsh中,print -l $path保存了一些按键。如果$path包含反斜杠,它将失败,但这是非常不寻常的。
吉尔(Gilles)'“ SO-不要邪恶”

请注意,其中一些将无法显示中的空白条目$PATH
斯特凡Chazelas

@StephaneChazelas:我从未想过。前两个显示空条目。仅zsh的不支持。

4

这是一种快速的方法 bash

OLDIFS=$IFS IFS=: arr=($PATH) IFS=$OLDIFS
printf "%s\n" "${arr[@]}"

4
您可以避免IFS使用子外壳程序进行保存/还原。例如(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
尼克

1
这也将无法显示在大多数炮弹空项,如果它是最后一个(/bin:/usr/bin:以前是为了一个共同的价值$PATH
斯特凡Chazelas

在也可以失败,如果$PATH包含一些通配符(不可能)
斯特凡Chazelas

当你指定的bash,无论如何,你可以使用IFS=: read -a arr <<< "$PATH"的拆分部分。这样,IFS新值仅在执行时使用read,因此无需还原它。pastebin.com/7E7C4AcR
manatwork 2013年

感谢大家的反馈。@manatwork,您知道为什么IFS新值在创建数组后仍然存在,但在执行后却不存在read吗?
iruvar


1

请注意,未设置的PATH与空的PATH具有不同的含义。空的PATH包含一个空元素,这意味着仅在当前目录中查找可执行文件,未设置的PATH则意味着在默认目录列表中搜索可执行文件(但请注意,在某些系统上,并非每个工具都同意以下内容:该列表)

zsh

if (($+PATH)); then
  echo "$#path element(s):"
  printf '%q\n' "$path[@]"
else
  echo "PATH unset"
fi

在POSIX shell中(请注意,就此而言,zsh即使在sh模式下也不是POSIX):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.