Saya mencoba untuk cd
menerima nama direktori yang dialihkan ke sana dari perintah lain. Tidak satu pun dari metode ini yang berfungsi:
$ echo $HOME | cd
$ echo $HOME | xargs cd
Ini berhasil:
$ cd $(echo $HOME)
Mengapa set perintah pertama tidak berfungsi, dan adakah yang lain juga gagal dengan cara ini?
shell
io-redirection
pipe
cd-command
Jhonathan
sumber
sumber
Jawaban:
cd
bukan perintah eksternal - ini adalah fungsi shell builtin. Ini berjalan dalam konteks shell saat ini, dan tidak, seperti yang dilakukan perintah eksternal, dalam konteks fork / exec'd sebagai proses yang terpisah.Contoh ketiga Anda berfungsi, karena shell memperluas variabel dan substitusi perintah sebelum memanggil
cd
builtin, sehinggacd
menerima nilai${HOME}
sebagai argumennya.Sistem POSIX memang memiliki biner
cd
- pada mesin FreeBSD saya, itu ada/usr/bin/cd
, tetapi tidak melakukan apa yang Anda pikirkan. Memanggil binercd
menyebabkan shell untuk garpu / exec biner, yang memang mengubah direktori kerjanya menjadi nama yang Anda berikan. Namun, segera setelah itu terjadi, biner keluar, dan proses bercabang / exec menghilang, mengembalikan Anda ke shell Anda, yang masih dalam direktori itu sebelum Anda mulai.sumber
cd
perintah eksternal ?cd
tidak membaca input standar. Itu sebabnya contoh pertama Anda tidak berfungsi.xargs
membutuhkan nama perintah, yaitu nama yang dapat dieksekusi secara independen.cd
harus berupa perintah bawaan shell dan tidak akan memiliki efek (selain memverifikasi bahwa Anda dapat mengubah ke direktori itu dan efek samping potensial yang mungkin terjadi pada direktori automountable) jika itu adalah executable. Itulah sebabnya contoh kedua Anda tidak berhasil.sumber
Selain jawaban yang baik yang sudah ada, perlu juga disebutkan bahwa sebuah pipa melakukan proses baru, yang memiliki direktori kerja tersendiri. Karenanya, mencoba melakukan ini, tidak akan berhasil:
Dengan demikian, Anda tidak akan berada di folder / setelah shell kembali dari perintah ini.
sumber
a | b
, bahkan jikaa
danb
dibangun, setidaknya satu maka tidak berjalan dalam proses shell, tetapi tidak ada jaminan yang mana itu. Misalnya dalam AT&Tksh
,zsh
ataubash -O lastpipe
,b
dijalankan dalam proses shell saat ini, sehingga kode Anda akan membawa Anda ke / di sana.Selain jawaban yang benar sudah diberikan: Jika Anda menjalankan bash dan ingin mencari tahu apa "perintah" seperti cd Anda dapat menggunakan tipe
atau mengapa tidak:
sementara misalnya waktu gnu biasanya sudah termasuk dalam distribusi favorit Anda:
Okey okey Anda mendapatkan ide, lalu apa jenisnya?
Berikut cuplikan manual bash:
sumber
Seperti yang orang lain katakan, itu tidak akan berfungsi karena
cd
ini adalah perintah shell builtin, bukan program eksternal, sehingga tidak memiliki input standar yang dapat Anda gunakan untuk memasukkan apa pun.Tetapi, bahkan jika itu berhasil, itu tidak akan melakukan apa yang Anda inginkan: sebuah pipa menumbuhkan proses baru dan mengarahkan output standar dari perintah pertama ke input standar dari yang kedua, sehingga hanya proses baru yang akan mengubah kerjanya saat ini direktori; ini tidak dapat memengaruhi proses pertama dengan cara apa pun.
sumber
read
biasanya (selalu?) shell builtin. Memang benar bahwacd
mengabaikan stdin, tetapi ini bukan karena itu adalah builtin.Opsi lain adalah backticks, yang menempatkan stdout dari satu perintah sebagai argumen baris perintah dari perintah kedua, dan lebih portabel daripada
$(...)
. Sebagai contoh:atau lebih umum;
Perhatikan bahwa penggunaan backticks tergantung pada shell untuk mengeksekusi perintah dan mengganti output pada baris perintah. Kebanyakan kerang mendukungnya.
sumber
$(...)
bekerja. Saya tidak berpikir itu saran yang baik untuk merekomendasikan backticks sebagai gantinya, karena mereka memiliki aturan mengutip yang jauh lebih rumit dan umumnya lebih rentan kesalahan. (Lihat §3.5.4 "Pergantian Perintah" dalam Manual Referensi Bash .)$(...)
pada satu sistem tetapi tidak pada yang lain ??$(…)
. Sistem tanpa shell POSIX (yaitu dengan shell Bourne asli) akan sangat tua. Bahkan sistem di mana/bin/sh
shell Bourne dan Anda memerlukan jalur lain seperti/usr/xpg4/bin/sh
untuk mendapatkan shell POSIX jarang terjadi saat ini. Merekomendasikan backticks kepada siapa pun yang tidak mengelola unix boxen kuno secara profesional adalah merugikan mereka.