2012-07-25 62 views
90

Tôi đã định nghĩa cùng một đường dẫn trong biến $ PATH 6 lần.

Tôi đã không đăng xuất để kiểm tra xem nó có hoạt động hay không.

Làm cách nào để xóa các bản sao?

Các $ PATH biến trông như thế này:

echo $PATH 

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin 

Làm thế nào tôi sẽ thiết lập lại nó để chỉ

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 
+0

nơi bạn đã định nghĩa nó 6 lần? trong đó các tập tin? – hovanessyan

+3

có thể trùng lặp của [Cách thanh lịch nhất để xóa đường dẫn khỏi biến $ PATH trong Bash là gì?] (Http://stackoverflow.com/questions/370047/what-is-the-most-elegant-way-to -remove-a-path-from-the-path-biến-in-bash) –

Trả lời

88

bạn chỉ cần thực hiện:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

đó sẽ là cho phiên hiện tại, nếu bạn muốn thay đổi vĩnh viễn thêm nó vào bất kỳ .bashrc, bash.bashrc,/etc/profile - bất cứ điều gì phù hợp với nhu cầu của hệ thống và người dùng của bạn.

+0

có, tôi đặt chúng vĩnh viễn trong bash.bashrc. Vì vậy, lệnh nên được một cái gì đó như thế này? Xuất «echo» PATH = $ PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games '>> ~/.bashrc ' –

+0

điều là tùy thuộc vào hệ điều hành của bạn một chuỗi các cấu hình được thực hiện. Bạn cần đảm bảo biến PATH không được ghi đè sau. Cách dễ nhất để thực hiện điều đó (đối với một người dùng) là ghi đè nó trong tệp .bashrc cá nhân của người dùng, thường nằm trong thư mục chính của người dùng đó. – hovanessyan

+0

lệnh của bạn đặt PATH thành - $ PATH (giá trị hiện tại của PATH) + chuỗi/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gam‌ es. Nếu bạn muốn chỉ có String, hãy xóa $ PATH + dấu chấm phẩy (:) khỏi lệnh của bạn. Nó không quan trọng nếu bạn sử dụng echo hoặc chỉnh sửa tập tin ~/.bashrc bằng tay. – hovanessyan

0

Làm sao bạn thêm những con đường trùng lặp để biến PATH của bạn? Bạn phải chỉnh sửa một trong các tệp . của mình. (.tcshrc hoặc .bashrc, v.v. tùy thuộc vào hệ thống/vỏ cụ thể của bạn). Cách khắc phục nó là chỉnh sửa lại tệp và xóa các đường dẫn trùng lặp.

Nếu bạn không chỉnh sửa bất kỳ tệp nào và bạn phải sửa đổi PATH một cách tương tác. Trong trường hợp đó, các thay đổi sẽ không "dính", nghĩa là nếu bạn mở một trình bao khác hoặc đăng xuất và đăng nhập lại, các thay đổi sẽ tự động bị xóa.

Lưu ý rằng có một số tệp cấu hình rộng của hệ thống, nhưng bạn không thể sửa đổi chúng, vì vậy rất có thể bạn sẽ thay đổi tệp trong thư mục chính cá nhân của mình (nếu bạn muốn thực hiện những thay đổi đó vĩnh viễn sau khi bạn giải quyết thiết lập các đường dẫn)

0

Giả sử vỏ của bạn là Bash, bạn có thể thiết lập các đường dẫn với

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

nhưng cũng giống như Levon nói trong câu trả lời khác, ngay sau khi bạn chấm dứt vỏ những thay đổi sẽ biến mất. Bạn có thể muốn thiết lập PATH trong ~/.bash_profile hoặc ~/.bashrc của mình.

0

Không có công cụ chuẩn để "chỉnh sửa" giá trị $PATH (tức là "chỉ thêm thư mục khi nó chưa tồn tại" hoặc "xóa thư mục này").

Để kiểm tra đường dẫn sẽ là gì khi bạn đăng nhập lần sau, hãy sử dụng telnet localhost (hoặc telnet 127.0.0.1). Sau đó, nó sẽ yêu cầu tên người dùng và mật khẩu của bạn.

Điều này cung cấp cho bạn một vỏ đăng nhập mới (nghĩa là một trình bao mới hoàn toàn không kế thừa bất kỳ thứ gì từ môi trường hiện tại).

Bạn có thể kiểm tra giá trị của $PATH tại đó và chỉnh sửa các tệp rc cho đến khi nó đúng. Điều này cũng hữu ích để xem liệu bạn có thể đăng nhập lại sau khi thực hiện thay đổi đối với một tệp quan trọng hay không.

+0

Thay vì phải nhập tên người dùng/mật khẩu, chỉ cần gõ vào '/ bin/bash -i'. Rất ít rắc rối. –

7

Dưới đây là một mã một dòng mà dọn dẹp PATH

  • Nó không làm phiền thứ tự của các PATH, chỉ cần loại bỏ các bản sao
  • Treats: và empth PATH duyên dáng
  • Không ký tự đặc biệt sử dụng , vì vậy không cần thoát
  • Sử dụng /bin/awk để nó hoạt động ngay cả khi PATH được chia

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";} 
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1; 
    printf(((NR==1)?"":":")$0)}}')"; 
    
57

Nếu bạn đang sử dụng Bash, bạn cũng có thể làm như sau nếu, giả sử, bạn muốn loại bỏ các thư mục /home/wrong/dir/ từ PATH biến của bạn:

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'` 
+1

Điều này rất hữu ích đối với tôi, vì một thư mục được thêm vào/etc/profile mà tôi muốn loại trừ, nhưng không có quyền ghi vào/etc. Cảm ơn :) – Samizdis

+10

Protip: bạn có thể sử dụng dấu phân tách khác nhau trong biểu thức sed để tránh \/thoát: 'PATH = $ (echo $ PATH | sed -e 's |:/home/wrong/dir | $ ||') ' – iNecas

+3

Thủ thuật này giúp khi tôi muốn có PATH mới ngay lập tức và không muốn đăng xuất khỏi thiết bị đầu cuối hiện tại. Tuy nhiên, để tránh rối tung lên, bạn nên thử nghiệm với lệnh tạo PATH (tức là 'echo $ PATH | sed -e' s /: \/home \/wrong \/dir \/$ // '') trước khi gán nó cho CON ĐƯỜNG. – biocyberman

10

Nếu bạn cần phải loại bỏ một con đường từ PATH biến trước khi kịch bản của bạn chạy thêm video này vào đầu của kịch bản:

PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;') 

Nếu bạn cần, bạn có thể thêm lại nó ở phía trước của danh sách với:

PATH=/home/user/bin:$PATH 

Hoặc bạn có thể thêm lại vào cuối danh sách với:

PATH=$PATH:/home/user/bin 
+0

Điều này làm việc cho tôi. – jessiPP

1

Trong bash bạn chỉ có thể $ {var/tìm/thay thế}

PATH=${PATH/%:\/home\/wrong\/dir\//} 

Hoặc trong trường hợp này (vì bit thay thế trống) chỉ:

PATH=${PATH%:\/home\/wrong\/dir\/} 

Tôi đến đây trước nhưng đã đi se ware như tôi nghĩ rằng sẽ có một parameter expansion để làm điều này. Dễ dàng hơn sed !.

How to replace placeholder character or word in variable with value from another variable in Bash?

+0

'%' có nghĩa là khớp nếu ở cuối chuỗi, '#' là để bắt đầu. – sabgenton

1

Đối với một cách dễ dàng copy-paste mẫu tôi sử dụng đoạn mã Perl này:

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::` 

Bằng cách này bạn không cần phải thoát khỏi dấu gạch chéo cho các nhà điều hành thay thế.

3

Linux từ đầu có này function in /etc/profile

# Functions to help us manage paths. Second argument is the name of the 
# path variable to be modified (default: PATH) 
pathremove() { 
     local IFS=':' 
     local NEWPATH 
     local DIR 
     local PATHVARIABLE=${2:-PATH} 
     for DIR in ${!PATHVARIABLE} ; do 
       if [ "$DIR" != "$1" ] ; then 
        NEWPATH=${NEWPATH:+$NEWPATH:}$DIR 
       fi 
     done 
     export $PATHVARIABLE="$NEWPATH" 
} 

này được thiết kế để được sử dụng với các chức năng này cho thêm vào con đường, do đó bạn không làm điều đó dư thừa:

pathprepend() { 
     pathremove $1 $2 
     local PATHVARIABLE=${2:-PATH} 
     export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}" 
} 

pathappend() { 
     pathremove $1 $2 
     local PATHVARIABLE=${2:-PATH} 
     export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1" 
} 

Simple sử dụng chỉ để cung cấp cho pathremove đường dẫn thư mục cần xóa - nhưng hãy nhớ rằng nó phải khớp chính xác:

$ pathremove /home/username/anaconda3/bin 

Điều này sẽ xóa từng trường hợp của thư mục đó khỏi đường dẫn của bạn.

Nếu bạn muốn thư mục trong đường dẫn của mình, nhưng không có dư thừa, bạn chỉ có thể sử dụng một trong các chức năng khác, ví dụ: - đối với trường hợp cụ thể của bạn:

$ pathprepend /usr/local/sbin 
$ pathappend /usr/local/bin 
$ pathappend /usr/sbin 
$ pathappend /usr/bin 
$ pathappend /sbin 
$ pathappend /bin 
$ pathappend /usr/games 

Nhưng, trừ khi khả năng đọc là mối quan tâm, vào thời điểm này bạn nên chỉ thực hiện:

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 
Các vấn đề liên quan