Saya perhatikan bahwa ada biner yang dapat dieksekusi /bin/echo
pada sistem Ubuntu MATE 17.04 saya.
Saya pikir, itu aneh, karena
$ type echo
echo is a shell builtin
Pengujian sepintas menunjukkan bahwa /bin/echo
melakukan hal yang sama seperti Bash builtin echo
:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Jadi, mengapa ada versi lain yang echo
terpisah dari program Bash, dan mengapa atau kapan saya ingin menggunakannya?
command-line
bash
echo
Zanna
sumber
sumber
echo
disediakan sebagai shell builtin, sementara yang ini bertanya mengapa disediakan sebagai perintah eksternal.Jawaban:
Jika Anda membuka
bash
prompt dan mengetikkanecho
perintah, yang menggunakan shell builtin daripada menjalankan/bin/echo
. Alasan yang masih penting untuk tetap/bin/echo
ada adalah:echo
builtin. Ini sebenarnya tidak diperlukan.Untuk memperluas pada # 1, misalkan Anda ingin memindahkan semua file biasa yang namanya mulai dari
abc
mana sajasrc
kedest
. Ada beberapa cara untuk melakukan itu tetapi salah satunya adalah:Tapi misalkan, daripada hanya menjalankannya, Anda ingin melihat setiap perintah yang akan dijalankan terlebih dahulu. Nah, maka Anda bisa menambahkan
echo
ke perintah, sama seperti Anda dalam konteks lain:Tetapi
find
tidak menggunakan shell. Itu berjalan/bin/echo
.Selain
find
dengan-exec
atau-execdir
,/bin/echo
executable akan dipanggil oleh program lain yang menjalankan program sendiri tetapi tidak melalui shell. Ini terjadi denganxargs
perintah (yang berkaitan denganfind
), serta di sejumlah konteks lain, seperti yangExec=
baris dari sebuah.desktop
file yang . Contoh lain adalah ketika Anda menjalankansudo echo
, yang dapat berguna untuk pengujian jikasudo
berfungsi.Demikian pula, beberapa kerang memiliki
printf
builtin tetapi/usr/bin/printf
juga ada.Alasan yang kurang umum yang mungkin Anda sengaja gunakan
/bin/echo
adalah jika Anda mengandalkan perbedaan antara itu danecho
perintah yang diberikan oleh shell Anda.man echo
dokumen/bin/echo
;help echo
dalambash
dokumenbash
bawaan.echo
tidak terlalu portabel, karena implementasi yang berbeda - baik lintas sistem operasi maupun lintas shell pada sistem operasi yang sama - mendukung opsi yang berbeda (misalnya,-e
) dan berbeda dalam perawatan backslash . Tentu saja, lebih baik untuk tidak mengandalkan detail seperti itu, dan menggunakannyaprintf
sebagai gantinya, yang jauh lebih portabel .Di
bash
, Anda dapat membuattype
pertunjukan bawaan/bin/echo
juga - dengan asumsi/bin
ada di dalam Anda$PATH
sebagaimana mestinya - dengan mengedarkannya-a
flag :sumber
cd
ada yang dapat dieksekusi (yang, ketika dijalankan, mengubah direktori dan berhenti, meninggalkan pemanggil di mana mereka sebelumnya) dan beberapa OS memilikinya. Mungkin bermanfaat untuk mengutip 4.1 dalam standar GNU .cd
hanyalah sebagai tes kemampuan untuk mengakses direktori yang diberikan: jika/usr/bin/cd some/dir
berhasil, dalam satu kesempatan Anda telah menguji: a) yangsome/dir
ada, b) bahwa itu adalah direktori atau tautan ke satu, dan c) izin yang diperlukan bagi Anda untuk mengakses direktori yang ada; semua tanpa mengubah kondisi Anda sendiri./bin/echo
, tidak\bin\echo
, kecuali jika Anda menggunakan Windows. ;)Eliah melakukan pekerjaan yang bagus untuk menjawab ini, tetapi saya ingin berkomentar tentang bagian "mengapa ada versi lain yang
echo
terpisah dari program Bash". Itu pertanyaan yang salah.Pertanyaan yang tepat adalah: mengapa ini dibangun di tempat pertama , padahal bisa saja (dan) merupakan perintah eksternal yang baik-baik saja?
Untuk kesederhanaan, lihat builtin di dash, 38 sangat sedikit (bash memiliki 61, untuk perbandingan, pergi dengan output dari
compgen -b
):Berapa banyak dari ini yang harus dibangun?
[
,echo
,false
,printf
,pwd
,test
, Dantrue
tidak perlu menjadi builtin: Mereka tidak melakukan apa pun yang hanya builtin dapat melakukan (mempengaruhi atau mendapatkan negara shell yang tidak tersedia untuk perintah eksternal). Bashprintf
setidaknya mengambil keuntungan sebagai builtin:printf -v var
menyimpan output ke variabelvar
.time
di bash juga istimewa: dengan menjadi kata kunci, Anda dapat mengatur waktu daftar perintah arbitrer di bash (tanda hubung tidak memiliki yangtime
setara).pwd
tidak perlu menjadi builtin juga - perintah eksternal apa pun akan mewarisi direktori kerja saat ini (dan itu juga perintah eksternal ).:
adalah pengecualian - Anda memerlukan NOP, dan:
apakah itu. Sisanya melakukan tindakan yang dapat dilakukan dengan mudah oleh perintah eksternal.Jadi, seperlima dari builtin ini tidak perlu builtin. Lalu mengapa? Halaman
dash
manual * sebenarnya menjelaskan secara sepintas mengapa ini adalah bawaan (penekanan milikku):Cukup banyak: bawaan ini ada karena sering digunakan, secara interaktif dan dalam skrip, dan fungsinya cukup sederhana, sehingga shell dapat melakukan pekerjaannya. Dan itu terjadi: beberapa (? Kebanyakan) kerang mengambil pekerjaan ** Kembali ke. Yang
sh
dari 2,9 BSD , dan Anda tidak akan menemukanecho
builtin.Jadi, sangat mungkin shell minimal dapat melewati implementasi perintah seperti builtin (saya pikir shell saat ini tidak melakukannya). Proyek GNU coreutils tidak berasumsi bahwa Anda akan menjalankannya dalam shell tertentu, dan POSIX membutuhkan perintah ini. Jadi, coreutils menyediakan ini, dan melewatkan yang tidak memiliki makna di luar shell.
* Ini hampir identik dengan teks halaman manual yang sesuai untuk shell Almquist , yang menjadi dasar dasbor itu, shell Debian Almquist, didasarkan.
**
zsh
membawa ide ini ke ekstrem: perintah yang Anda dapatkan dengan memuat berbagai modul, sepertizmv
, adalah hal-hal yang Anda pikir tidak perlu dimasukkan ke dalam shell . Pada titik itu, pertanyaan sebenarnya adalah: mengapa Anda menggunakan bash alih-alih zsh, yang memiliki semua bawaan ini?sumber
:
sebagai eksternal tidak akan benar-benar menjadi NOP, Anda masih harusPATH
mencari, upaya untuk mengeksekusi perintah, dll, ketika semua yang Anda inginkan adalah secara tegas tidak melakukan apa-apa.:
sebagai builtin melakukan itu.pwd
built-in untuk bisa bekerja seperti itu, dengan perilaku default menunjukkan jalur "logis" (pwd -L
)./bin/pwd
hanya bisa menerapkanpwd -P
perilaku menunjukkan kepada Anda direktori induk yang sebenarnya, bukan symlink yang Andacd
lalui.pwd
sedikit terganggu oleh kehadiranPWD
, tetapi ya, itu juga merupakan contoh bash menggunakan status