Jawaban:
@ 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, cd
hanya mempertimbangkan argumen pertamanya, yang dalam hal ini adalah -
.
Apa yang mungkin ingin Anda tulis adalah cd
perintah 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 $OLDPWD
tidak 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 $someplace
atau cd -
) ditetapkan $? = 1
setelah berhasil $? = 0
.
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.
cd /tmp
bash
cd -
mengatakan bash: cd: OLDPWD not set
di cd kedua; sedangkan urutan cd /tmp
bash
cd $OLDPWD
menjatuhkan Anda ke ~ (hampir pasti karena $ OLDPWD berkembang menjadi string kosong). cd $OLDPWD
akan bekerja dengan baik setelah Anda melakukan setidaknya satu cd
di shell yang bersangkutan, tetapi tidak sebelum itu.
$OLDPWD
tidak disetel, ini akan menurunkan Anda~
.cd -
akan mencetak kesalahan (dan mungkin meninggalkan Anda di tempat yang sudah ada).