Gunakan "cd -" tanpa output apa pun

28

Bagaimana cara menjalankan cd -perintah tanpa mengeluarkan output apa pun?
Saya mencoba cd - 2>&1 /dev/nulltetapi yang mencetak direktori tujuan.
Alasan untuk ini adalah bahwa saya ingin menggunakannya sebagai fungsi bash dan saya lebih suka tidak memiliki output yang tidak perlu.

Batandwa
sumber

Jawaban:

32

Coba seperti ini:

cd - > /dev/null

Anda juga dapat melakukan:

cd - > uselessfile

Ini akan mengirim output ke file "uselessfile" alih-alih ke STDOUT.

Anda juga dapat menambahkan alih-alih membuat atau menimpa file.

cd - >> uselessfile
erewok
sumber
15

@ erewok sudah menjawab pertanyaan , tapi saya akan coba menjelaskan apa yang sebenarnya terjadi dan mengapa Anda melihat perilaku yang Anda lakukan.

Masalahnya adalah dengan pengalihan Anda. Kamu sedang menulis:

cd - 2>&1 /dev/null

yang karena pengalihan dapat muncul di mana saja dalam baris perintah (Anda dapat mengonfirmasi ini sendiri dengan sesuatu yang sederhana seperti echo a b 2>&1 c </etc/fstab d), setelah pengalihan dilucuti sebenarnya menjadi:

cd - /dev/null

Lihat masalahnya? Anda memberikan dua argumen cd, bukan satu argumen dan dua pengalihan. Karena Anda hanya dapat berada dalam satu direktori saat ini pada satu waktu, cdhanya mempertimbangkan argumen pertamanya, yang dalam hal ini adalah -.

Apa yang mungkin ingin Anda tulis adalah cdperintah dengan pengalihan stderr dan stdout ke / dev / null. Ada dua cara untuk melakukan itu.

Cara termudah dalam kasus Anda adalah dengan menginformasikan shell yang ingin Anda redirection, dengan menambahkan >karakter. Inilah yang disarankan @erewok.

cd - 2>&1 >/dev/null

Ini mengarahkan ulang stderr (file descriptor 2) ke file descriptor 1 (stdout), kemudian mengarahkan ulang stdout (implisit 1) ke / dev / null. Perhatikan bahwa pemesanan itu penting; Anda tidak akan mendapatkan hasil yang sama jika Anda membalikkan pengalihan, meskipun dalam beberapa kasus mungkin Anda lakukan karena cara program tertentu menggunakan masing-masing aliran keluaran.

Atau, seperti yang telah disarankan oleh @demure , Anda dapat menggunakan &>untuk mengarahkan ulang kedua aliran sekaligus jika sintaks ini didukung oleh shell Anda.

cd - &>/dev/null

Perhatikan bahwa salah satu dari alternatif ini juga akan membungkam kesalahan saat $OLDPWDtidak ada lagi, karena Anda mengarahkan output kesalahan standar ke dalam lubang hitam sistem. Jika ini masalah, saya akan memeriksanya $?sesudahnya; Anda harus mengonfirmasi hal ini sendiri jika itu merupakan masalah nyata, tetapi setidaknya dalam pengujian saya, gagal cd(apakah cd $someplaceatau cd -) ditetapkan $? = 1setelah berhasil $? = 0.

sebuah CVn
sumber
5

Mungkin Anda bisa menggunakannya

cd $OLDPWD

tetapi dalam hal ini Anda akan perlu lebih banyak mengetik :)

Tetapi Anda akan memiliki keuntungan: jika ada kesalahan pesan tidak akan dialihkan ke / dev / null.

uzsolt
sumber
1
Jika $OLDPWDtidak disetel, ini akan menurunkan Anda ~. cd -akan mencetak kesalahan (dan mungkin meninggalkan Anda di tempat yang sudah ada).
CVn
1
Kamu tidak benar. Jika $ OLDPWD tidak disetel (mengapa? Mungkin pengguna dapat menghapusnya), 'cd -' memiliki hasil yang sama dengan "cd $ OLDPWD". Periksa halaman manual ('cd -' sama dengan 'cd "$ OLDPWD" && pwd'). Atau Anda dapat mengujinya :) 'OLDPWD = ""; cd - '- lihat Anda akan jatuh ke ~ dan mencetak ~ karakter.
uzsolt
1
Saya baru saja mengujinya. Di sistem saya, urutannya cd /tmp bash cd -mengatakan bash: cd: OLDPWD not setdi cd kedua; sedangkan urutan cd /tmp bash cd $OLDPWDmenjatuhkan Anda ke ~ (hampir pasti karena $ OLDPWD berkembang menjadi string kosong). cd $OLDPWDakan bekerja dengan baik setelah Anda melakukan setidaknya satu cddi shell yang bersangkutan, tetapi tidak sebelum itu.
CVn
Hm, ya, Anda benar. Saya telah menguji dengan zsh dan dengan zsh tidak menjatuhkan pesan kesalahan.
uzsolt
1

Redirect stdout dan stderr: cd - &>/dev/null

itu &>adalah versi tangan pendek cd - 2>/dev/null 1>&2, yang menurut saya maksud Anda untuk digunakan ...

  • Note &>perlu bash> = 4.0.

Ps. sebagian besar perintah dapat diarahkan ke lokasi, jadi sepertinya Anda tidak perlu melakukannyacd

pendiam
sumber
0

Anda dapat gunakan:

cd ~-

Menurut halaman manual bash di bawah Tilde Expansion:

Jika awalan tilde adalah `~ - ', nilai variabel shell OLDPWD, jika diset, diganti.

Dru
sumber