Hiển thị PATH theo cách dễ đọc của con người


43

Tôi muốn hiển thị biến môi trường PATH của mình theo cách dễ đọc hơn.

$ 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

Tôi đang nghĩ về một cái gì đó như thế này:

$ 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
...

Câu trả lời:


62

Bạn có thể sử dụng 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
...

Bạn cũng có thể làm điều này trong một số shell (được thử nghiệm trong bash và zsh):

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

Trong zsh, bạn có thể sử dụng $pathbiến để xem đường dẫn của mình bằng dấu cách thay vì dấu hai chấm.

$ 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

Mà có thể được kết hợp với printfhoặc 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
...

Các <<<toán tử được gọi là herestrings. Herestrings chuyển từ bên phải của họ đến đầu vào tiêu chuẩn của lệnh bên trái của họ.

$ cat <<< 'Hello there'
Hello there

Nếu vỏ của bạn không hỗ trợ chúng, hãy sử dụng echovà đường ống.

$ echo 'Hello there' | cat
Hello there

2
Thú vị khi sử dụng chuỗi ở đây, tôi sẽ làm như sau: echo $PATH | tr ':' '\n'nhưng rõ ràng hơn là giải pháp của bạn.
Arturo Herrero

1
Tôi đã thêm một chút vào câu trả lời của mình để giải thích việc sử dụng herestrings cho bất kỳ người qua đường nào.

Trong zsh, print -l $pathlưu một vài tổ hợp phím. Nó không thành công nếu $pathchứa dấu gạch chéo ngược, nhưng điều đó rất bất thường.
Gilles 'SO- ngừng trở nên xấu xa'

Lưu ý rằng một số trong số đó sẽ không hiển thị các mục trống trong $PATH.
Stéphane Chazelas

@StephaneChazelas: Tôi chưa bao giờ nghĩ về điều đó. Hai mục đầu tiên hiển thị các mục trống. Những người chỉ zsh thì không.

4

Đây là một cách nhanh chóng với bash

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

4
Bạn có thể tránh lưu / khôi phục IFSbằng cách sử dụng một lớp con. ví dụ(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
Điều đó cũng sẽ không hiển thị một mục trống trong hầu hết các shell nếu nó cuối cùng ( /bin:/usr/bin:từng là giá trị chung cho $PATH)
Stéphane Chazelas

Trong cũng có thể thất bại nếu $PATHchứa một số ký tự đại diện (không có khả năng)
Stéphane Chazelas

Như bạn đã chỉ định bash, bạn có thể sử dụng IFS=: read -a arr <<< "$PATH"cho phần tách. IFSGiá trị mới của cách đó sẽ chỉ được sử dụng trong khi thực hiện read, do đó không cần khôi phục lại. pastebin.com/7E7C4AcR
thao tác

Cảm ơn tất cả các thông tin phản hồi. @manatwork, bạn có biết tại sao IFSgiá trị mới vẫn tồn tại sau khi tạo mảng mà không phải sau khi thực hiện readkhông?
iruvar


1

Lưu ý rằng một PATH chưa đặt có một ý nghĩa khác với một PATH trống. Một PATH trống chứa một phần tử trống và điều đó có nghĩa là chỉ tìm kiếm các tệp thực thi trong thư mục hiện tại, một PATH không được đặt có nghĩa là tìm kiếm các tệp thực thi trong danh sách thư mục mặc định (nhưng lưu ý rằng trên một số hệ thống, không phải mọi công cụ đều đồng ý với nội dung của danh sách đó)

Trong zsh:

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

Trong shell POSIX (lưu ý rằng zshngay cả trong shchế độ không phải là POSIX về vấn đề đó):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.