Câu trả lời:
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
@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, cd
chỉ 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 cd
lệ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 $OLDPWD
khô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 $someplace
hoặc không cd -
) đặt ra $? = 1
sau khi thành công $? = 0
.
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.
cd /tmp
bash
cd -
nói bash: cd: OLDPWD not set
ở cd thứ hai; trong khi đó trình tự cd /tmp
bash
cd $OLDPWD
thả 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 $OLDPWD
sẽ hoạt động tốt khi bạn đã thực hiện ít nhất một cd
trong vỏ trong câu hỏi, nhưng không phải trước đó.
Chuyển hướng stdout và stderr:
cd - &>/dev/null
đây &>
là phiên bản tay ngắn cd - 2>/dev/null 1>&2
mà tôi nghĩ bạn muốn sử dụng ...
&>
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
$OLDPWD
khô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 đã ở).