Bagaimana saya bisa menyalurkan hasil dari which
perintah ke cd
?
Inilah yang saya coba lakukan:
which oracle | cd
cd < which oracle
Tapi tidak satupun dari mereka berhasil.
Apakah ada cara untuk mencapai ini (daripada salin / tempel tentu saja)?
Edit: setelah dipikir-pikir, perintah ini akan gagal, karena file tujuan BUKAN folder / direktori .
Jadi saya berpikir dan mencari cara yang lebih baik untuk menyingkirkan bagian trailing "/ oracle" sekarang (sed atau awk, atau bahkan Perl) :)
Sunting: Oke itulah yang saya dapatkan pada akhirnya:
cd `which oracle | sed 's/\/oracle//g'`
dirname
,basename
?Jawaban:
Anda menggunakan pipa dalam kasus di mana perintah mengharapkan parameter dari input standar. ( Lebih lanjut tentang ini ).
Dengan
cd
perintah itu tidak terjadi. Direktori adalah argumen perintah. Dalam kasus seperti itu, Anda dapat menggunakan substitusi perintah. Gunakan backticks atau$(...)
untuk mengevaluasi perintah, simpan ke dalam variabel ..path=`which oracle` echo $path # just for debug cd $path
meskipun itu bisa dilakukan dengan cara yang jauh lebih sederhana:
cd `which oracle`
atau jika jalur Anda memiliki karakter khusus
cd "`which oracle`"
atau
cd $(which oracle)
yang setara dengan notasi backtick, tetapi disarankan (backtick bisa disalahartikan dengan apostrof)
.. tapi sepertinya Anda menginginkan:
cd $(dirname $(which oracle))
(yang menunjukkan bahwa Anda dapat menggunakan bersarang dengan mudah)
$(...)
(serta tanda kutip) juga dapat digunakan dalam string yang dikutip ganda, yang membantu saat hasil akhirnya mungkin berisi spasi ..cd "$(dirname "$(which oracle)")"
(Perhatikan bahwa kedua keluaran membutuhkan satu set tanda kutip ganda.)
sumber
cd "$(dirname "$(which oracle)")"
.|
membuka proses baru, jadi meskipuncd
membaca dari STDIN,cmd | cd
tidak akan berfungsi (yaitu direktori saat ini dalam proses asli akan tetap sama).Dengan dirname untuk mendapatkan direktori:
cd $(which oracle | xargs dirname)
EDIT: berhati-hatilah dengan jalur yang berisi spasi, lihat komentar @anishpatel di bawah
sumber
cd "$(which oracle | xargs -0 dirname)"
jika jalur mungkin berisi spasi. Bendera -0 membagi input dengan null, bukan spasi.cd `which oracle`
Perhatikan bahwa itu adalah backticks (umumnya tombol di sebelah kiri 1 pada keyboard AS)
sumber
cd "`which oracle`"
Oke, berikut solusi yang menggunakan kutipan yang benar:
cd "$(dirname "$(which oracle)")"
Hindari backticks, mereka kurang terbaca, dan selalu mengutip proses substitusi.
sumber
Anda tidak memerlukan pipa, Anda dapat melakukan apa yang Anda inginkan menggunakan perluasan parameter Bash!
Tip lebih lanjut: gunakan "type -P" daripada perintah eksternal "which" jika Anda menggunakan Bash.
# test touch /ls chmod +x /ls cmd='ls' PATH=/:$PATH if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; } else echo "No such program in PATH search directories: ${cmd}" exit 1 fi
sumber
Sebagai tanggapan atas pertanyaan yang Anda edit, Anda dapat menghapus nama perintah menggunakan
dirname
:cd $(dirname `which oracle`)
sumber
Selain jawaban yang bagus di atas, satu hal yang perlu disebutkan adalah bahwa cd adalah shell builtin, yang berjalan dalam proses yang sama selain proses baru seperti ls yang merupakan perintah.
/unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd
http://en.wikipedia.org/wiki/Shell_builtin
sumber