Sử dụng cd cd - mà không có đầu ra


28

Làm thế nào để tôi chạy cd -lệnh mà không lặp lại bất kỳ đầu ra?
Tôi đã thử cd - 2>&1 /dev/nullnhưng nó in ra thư mục đích.
Lý do cho điều này là tôi muốn sử dụng nó một hàm bash và tôi muốn không có đầu ra không cần thiết.

Câu trả lời:


32

Hãy thử nó như thế này:

cd - > /dev/null

Bạn cũng có thể làm:

cd - > uselessfile

Điều này sẽ gửi đầu ra đến tệp "vô dụng" thay vì tới STDOUT.

Bạn cũng có thể nối thêm thay vì tạo hoặc ghi đè tệp.

cd - >> uselessfile

15

@erewok đã trả lời câu hỏi , nhưng tôi sẽ cố gắng giải thích những gì đang thực sự xảy ra và tại sao bạn lại thấy hành vi mà bạn làm.

Vấn đề là với sự chuyển hướng của bạn. Bạn đang viết:

cd - 2>&1 /dev/null

mà bởi vì các chuyển hướng có thể xuất hiện ở bất cứ đâu trong dòng lệnh (bạn có thể tự xác nhận điều này bằng một cái gì đó đơn giản như echo a b 2>&1 c </etc/fstab d), sau khi các chuyển hướng bị tước thực sự trở thành:

cd - /dev/null

Thấy vấn đề? Bạn đang chuyển hai đối số sang cd, không phải một đối số và hai chuyển hướng. Vì bạn chỉ có thể ở trong một thư mục hiện tại cùng một lúc, cdchỉ xem xét đối số đầu tiên của nó, trong trường hợp này là -.

Những gì bạn có thể dự định viết là một cdlệnh với chuyển hướng của cả stderr và stdout thành / dev / null. Có hai cách để làm điều đó.

Cách dễ nhất trong trường hợp của bạn là chỉ cần thông báo cho shell mà bạn muốn chuyển hướng, bằng cách thêm một >ký tự. Đây là những gì @erewok đang gợi ý.

cd - 2>&1 >/dev/null

Điều này đầu tiên chuyển hướng stderr (mô tả tệp 2) thành mô tả tệp 1 (stdout), sau đó chuyển hướng stdout (ẩn 1) thành / dev / null. Lưu ý rằng việc đặt hàng là quan trọng; bạn sẽ không nhận được kết quả tương tự nếu bạn đảo ngược các chuyển hướng, mặc dù trong một số trường hợp, có vẻ như bạn làm vì cách chương trình cụ thể sử dụng các luồng đầu ra tương ứng.

Ngoài ra, như được đề xuất bởi @demure , bạn có thể sử dụng &>để chuyển hướng cả hai luồng cùng một lúc nếu cú ​​pháp này được hỗ trợ bởi trình bao của bạn.

cd - &>/dev/null

Xin lưu ý rằng bất kỳ giải pháp thay thế nào trong số này cũng sẽ tắt tiếng khi $OLDPWDkhông còn tồn tại, vì bạn đang chuyển hướng đầu ra lỗi tiêu chuẩn vào lỗ đen hệ thống. Nếu đây là một mối quan tâm, tôi sẽ kiểm tra $?sau đó; bạn nên tự xác nhận điều này nếu đó là một mối quan tâm thực sự, nhưng ít nhất trong các thử nghiệm của tôi, một thất bại cd(có cd $someplacehoặc không cd -) đặt ra $? = 1sau khi thành công $? = 0.


5

Có lẽ bạn có thể sử dụng

cd $OLDPWD

nhưng trong trường hợp này bạn sẽ cần gõ nhiều hơn :)

Nhưng bạn sẽ có một lợi thế: nếu có bất kỳ lỗi nào, thông báo sẽ không chuyển hướng vào / dev / null.


1
Nếu $OLDPWDkhông được đặt, điều này sẽ thả bạn vào ~. cd -sẽ in một lỗi (và có lẽ để lại cho bạn nơi bạn đã ở).
một CVn

1
Bạn đã không đúng. Nếu $ OLDPWD không được đặt (tại sao? Có lẽ người dùng có thể hủy đặt cái này), 'cd -' có kết quả tương tự như "cd $ OLDPWD". Kiểm tra trang hướng dẫn ('cd -' tương đương 'cd "$ OLDPWD" && pwd'). Hoặc bạn có thể kiểm tra nó :) 'OLDPWD = ""; cd - '- thấy bạn sẽ rơi vào ~ và in một ký tự ~.
uzsolt

1
Tôi chỉ thử nó. Trên hệ thống của tôi, trình tự cd /tmp bash cd -nói bash: cd: OLDPWD not setở cd thứ hai; trong khi đó trình tự cd /tmp bash cd $OLDPWDthả bạn vào ~ (gần như chắc chắn vì $ OLDPWD mở rộng thành một chuỗi trống). cd $OLDPWDsẽ hoạt động tốt khi bạn đã thực hiện ít nhất một cdtrong vỏ trong câu hỏi, nhưng không phải trước đó.
một CVn

Hừm, đúng rồi, bạn đã đúng. Tôi đã thử nghiệm với zsh và với zsh không bỏ thông báo lỗi.
uzsolt

1

Chuyển hướng stdout và stderr: cd - &>/dev/null

đây &>là phiên bản tay ngắn cd - 2>/dev/null 1>&2mà tôi nghĩ bạn muốn sử dụng ...

  • Lưu ý &>cần bash> = 4.0.

Thi thiên hầu hết các lệnh có thể được trỏ vào các vị trí, vì vậy không chắc bạn thực sự cần phảicd


0

Bạn có thể dùng:

cd ~-

Theo trang bash man dưới Tilde Expansionđây:

Nếu tiền tố dấu ngã là một `~ - ', giá trị của biến shell OLDPWD, nếu nó được đặt, được thay thế.

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.