Làm thế nào để sử dụng dấu ngã làm việc như một lối tắt đến thư mục nhà của tôi?


30

Tôi đã bối rối, cố gắng sao chép một số tệp từ PC này sang PC khác. Tôi đã tìm ra nó, nhưng cú pháp vẫn còn khó hiểu với tôi. Những công việc này:

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

trong đó đặt Volenteer.pngtrong thư mục /home/j0h/b. Tuy nhiên, điều này không hoạt động:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Điều này cũng thất bại, không tìm thấy tệp thoát trạng thái 1:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

Như thế này:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Rõ ràng, có một số khác biệt giữa ~~/ Sự khác biệt đó là sự hiện diện của/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

Vậy tại sao trong scp, ~giải quyết ~/? Đó là một phỏng đoán, tôi không thể xác minh đó là những gì đang xảy ra. Nhưng nó có vẻ không nhất quán, và do đó khó hiểu. Đây có phải là một lỗi trong scp? hoặc có điều gì đó về dấu ngã tôi đang thiếu?


2
Chỉ cần một lưu ý phụ ở đây, nó đánh vần là "tình nguyện viên", với một chữ "u" thay vì "e" :)
AER

2
Tôi là một người bán hàng tự do.
j0h

Câu trả lời:


68

~ là thư mục nhà của bạn.

~foolà thư mục chính của người dùng foo, nếu người dùng đó tồn tại hoặc chỉ là thư mục có tên ~foo, nếu người dùng đó không tồn tại.


Do đó, trong:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~Desktopsẽ mở rộng sang thư mục chính của người dùng Desktop, nếu một người dùng như vậy tồn tại (và nó thường không tồn tại) hoặc chỉ là ~Desktop(một đường dẫn thường không tồn tại).


Trong:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hsẽ mở rộng sang một thư mục có tên j0htrong jaythư mục chính của nó, một lần nữa, không có khả năng tồn tại.


Đó không phải là ~~/nơi khác biệt xảy ra, nhưng trong ~~foo.


Ngoài ra, ~cũng có thể được sử dụng để điều hướng lịch sử thư mục:

  • ~-là thư mục làm việc trước đó (như $OLDPWD)
  • ~+là thư mục làm việc hiện tại (như $PWD)

Điều này không áp dụng cho scp, vì bạn không được thay đổi thư mục ở giữa một scphoạt động.

Và nếu bạn sử dụng pushdpopd để duy trì một ngăn xếp thư mục, và sẽ là thư mục thứ trong ngăn xếp thư mục, như được thấy trong đầu ra của . sẽ là thư mục thứ từ cuối (tính từ 0, trong cả hai trường hợp). Ví dụ:~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

Sau đó, các thư mục trong ngăn xếp có thể được truy cập bằng cách sử dụng:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-

Vì vậy, ~+luôn luôn tương đương với .sau đó, phải không? Có vẻ dư thừa.
tự đại diện

1
@Wildcard tốt, không chính xác. ~+~-sử dụng các giá trị của $PWD$OLDPWD, đó là các đường dẫn tuyệt đối. .luôn luôn là một con đường tương đối. Vì vậy, nếu có một lệnh thay đổi thư mục làm việc hiện tại khi thực thi, nó sẽ thấy đường dẫn mới cho ., nơi đường dẫn được mở rộng ~-sẽ giữ nguyên. tar -Clà một ví dụ, mặc dù tôi thừa nhận tôi không thể nghĩ ra cách sử dụng tốt cho ~+. $PWDsẽ tốt như vậy, ngoại trừ việc bạn không cần trích dẫn ~+/foo/barnếu $PWDcó khoảng trắng.
muru

1
Cảm ơn, điều đó làm rõ nó. Trên thực tế đó là một ví dụ điển hình sử dụng ngay tại đó: Một số lệnh từ chối hoạt động trên các đường dẫn tương đối vì lý do bảo mật; với các lệnh như vậy bạn không thể sử dụng ./filenamenhưng có thể sử dụng "$PWD/filename"hoặc đơn giản hơn ~+/filename. (Và một số lệnh sẽ hoạt động trên tên đường dẫn tương đối nhưng có sự khác biệt về chức năng, chẳng hạn như lnhoặc tar.)
Wildcard

21

Hãy đọc tài liệu GNU về Mở rộng Bash Tilde (như tôi nên có trước khi lặp lại câu trả lời đầu tiên này).

~/Desktop~j0hđang làm những việc khác nhau cơ bản, điều này giải thích tại sao ~Desktopnó không hoạt động:

  • Một đồng bằng ~được thay thế cho $HOMEbiến môi trường hiện tại của bạn , được đặt khi đăng nhập. Vì vậy, ~giải quyết /home/olicho tôi, và ~/Desktopđọc như /home/oli/Desktop. Đây là nơi bạn thấy tilda được sử dụng nhiều nhất.

  • ~usernamegiải quyết đến nhà của người dùng đó , như được đặt trong /etc/passwd. Vì vậy, ~oligiải quyết /home/oli, ~j0hcó thể giải quyết /home/j0hnhưng không cần thiết, homedir của bạn có thể ở bất cứ đâu.

  • ~not-a-usernamekhông giải quyết. Bởi vì Desktopkhông phải là người dùng, ~Desktopkhông được thay thế. Nó được hiểu theo nghĩa đen là một tập tin hoặc đường dẫn có tên ~Desktop(không tồn tại ở đây).

Và không cần phải nói, tất cả điều này xảy ra từ xa (sẽ vô ích scpnếu nó được thay thế bằng các giá trị cục bộ). Điều này hoạt động vì Bash sẽ không thay thế ~...nếu nó đi trước bất cứ thứ gì trừ khoảng trắng.


getent passwd binnói gì
muru

2
"Bin" là người dùng hệ thống trên hầu hết các máy Linux, với thư mục chính là / bin.
fNek

1
Không thể mở rộng ~dirphù hợp với tài liệu GNU: "... các ký tự trong tiền tố dấu ngã sau dấu ngã được coi là tên đăng nhập có thể ... Nếu tên đăng nhập không hợp lệ hoặc mở rộng dấu ngã không thành công, từ đó được giữ nguyên. " Ở đây, dirkhông phải là tên của một người dùng trên hệ thống này, vì vậy nó không thay đổi.
apsillers

Cảm ơn tất cả. Tôi có lẽ nên đọc các liên kết tôi đăng :)
Oli

4

Biểu tượng ~được sử dụng như một phím tắt cho /home/userin bash, vì vậy trong trường hợp của ~/Desktop/Volenteer.pngnó là viết tắt cho /home/user/Desktop/Volenteer.png.

Vì vậy, như bạn có thể thấy /, như mọi khi, hiển thị một cấp độ mới trong hệ thống phân cấp hệ thống tệp.


3
chỉ đúng một nửa, đây là một tốc ký cho biến môi trường $ HOME. ~{user}/chỉ có thể là bất kỳ đường dẫn ngẫu nhiên nào được đặt bởi tệp cơ sở dữ liệu passwd (5). Mặc dù có, các tiêu chuẩn filesytem.org không đặt người dùng thường xuyên vào / nhà, đây không phải là trường hợp của mọi người dùng (ví dụ: root in / root và các dịch vụ trong / var / ... hoặc unixies cũ hơn sử dụng / usr thay vì / home)
Dwight Spencer

DwightSpencer là chính xác. Tôi duy trì một số máy chủ có người dùng ở / usr / {CLIENTNAME} / home / và được chia sẻ trên một số hệ thống đường phố và hệ thống từ xa (tất cả đều trỏ đến thư mục đó) vì vậy chỉ cần duy trì 1 hệ thống. Và ~ trỏ đến thư mục đó;)
Rinzwind

3
@Rinzwind eek. Tôi phải phản đối việc lạm dụng bất khả xâm phạm này /usr.
muru

@muru này không phải là cuộc gọi của tôi>: - D Đó là một phần còn lại từ SCO D:
Rinzwind

1
Thành thật tôi thích việc sử dụng / usr cho tất cả những thứ người dùng vì đó là ý nghĩa ban đầu của nó. Những gì tôi tìm thấy những ngày này là sự lạm dụng / usr / bin bất hợp pháp hơn như là một bãi rác thống nhất lớn của tất cả các nhị phân (sys, user, sysop) bên ngoài các binutils cơ sở. Sau khi tất cả / usr có nghĩa là tất cả những thứ người dùng có quyền truy cập được kéo từ mount nfs trong khi / usr / local là không gian người dùng cục bộ với / sbin là nhị phân sysop và / nhị phân hệ thống bin. Tôi nhận được rằng / home có thể là một phân vùng khác nhau nhưng vì vậy có thể / usr / home / ... giữ nó trong / usr giữ nó làm không gian tên người dùng cả về chính sách, triển khai và tư duy.
Dwight Spencer

3

~là tốc ký cho biến môi trường $HOMEtrên hầu hết các dẫn xuất shell c / hỗ trợ shell tương thích POSIX. Việc sử dụng phổ biến nhất ~là khi tham khảo thư mục nhà riêng của bạn hoặc của nhà người dùng khác:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

Để tìm thư mục chính cho bất kỳ người dùng cục bộ nào trên hệ thống POSIX (UNIX, Linux, OS X, BSD) đang sử dụng cơ sở dữ liệu passwd (5), hãy chạy /etc/passwdnhư vậy:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

Điều này sẽ liệt kê từng người dùng địa phương và thư mục nhà của họ.

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.