Linux & Shell - Apakah Shell suatu keharusan?

8

Total pertanyaan pemula.

Mengapa kita membutuhkan shell di Linux? Sebagai contoh ketika saya mengetik - find. -nama xy * - Saya diberi tahu bahwa shell mengambil input ini dan memanggil perintah find (memastikan wild card ditafsirkan dengan benar dan semua itu). Tidak bisakah ini dilakukan tanpa konsep shell? ... jika shell melacak berbagai proses tidak dapatkah ini dilakukan tanpanya?

Juga, mengapa saya bisa mengetik> ls xy * dan mendapatkan output yang tepat sementara saya perlu melarikan diri * dengan \ in find - find. -nama xy \ * Apakah shell melakukan ekspansi wild card untuk satu dan tidak untuk executable lainnya?

Terima kasih.


sumber
9
Menggunakan Linux tanpa shell seperti mengemudi Ferrari 50 km / jam melalui lalu lintas kota. Semua kesenangan akan hilang begitu saja.
vava

Jawaban:

23

Tidak bisakah ini dilakukan tanpa konsep shell?

Ya tidak. Anda memerlukan sesuatu yang menginterpretasikan maksud Anda dan menjalankan program yang sesuai. Benda itu disebut cangkang.

EDIT: Untuk menghindari kebingungan, "shell" tidak berarti "antarmuka baris perintah". Dari http://en.wikipedia.org/wiki/Shell_(computing) :

"Kerang sistem operasi umumnya jatuh ke dalam salah satu dari dua kategori: baris perintah dan grafis. Kerang baris perintah menyediakan antarmuka baris perintah (CLI) ke sistem operasi, sedangkan kerangka grafis menyediakan antarmuka pengguna grafis (GUI). Dalam kedua kategori tujuan utama shell adalah untuk memanggil atau "meluncurkan" program lain, namun, shell sering memiliki kemampuan tambahan seperti melihat isi direktori. "

Adapun pertanyaan Anda yang lain, shell melakukan ekspansi wildcard untuk kedua perintah, tetapi ketika Anda mencari file menggunakan find, Anda ingin menemukan, dan bukan shell, untuk melakukan ekspansi, karena Anda ingin melakukannya dilakukan di lokasi yang dicari di dan bukan di lokasi tempat ia dipanggil; Oleh karena itu, Anda keluar dari * untuk menghentikan shell memperluasnya, sehingga menemukan dapat melihatnya.

bayangan bulan
sumber
jadi, Anda mengatakan bahwa di Windows tombol Start disebut shell? :-)
5
Ini bukan penggunaan umum, tetapi GUI bisa dibilang shell (setidaknya jika mereka berjalan di luar kernel). Tombol Start hanyalah fitur dari GUI ...
dmckee
Tombol Start jelas merupakan hal "yang menginterpretasikan maksud Anda dan memanggil program yang sesuai". OTOH, shell Linux bisa disebut sebagai fitur TUI (Text User Interface).
11
@ Paul: Explorer, program yang menyediakan tombol start adalah shell windows. Bahkan, itu adalah sebuah shell Windows, itu bisa diganti.
moonshadow
1
Ya, tombol start dapat dilihat sebagai shell. Bukan shell interaktif tetapi shell. Namun biasanya, ketika seseorang mengatakan "shell" yang mereka maksud adalah prompt interaktif (misalnya, prompt perintah pada windows adalah shell tradisional)
5

Anda tentu saja dapat melakukan semuanya melalui GUI. Windows 'Find Files (dari XP dan sebelumnya) adalah setara dengan GUIsh dari perintah yang Anda ketikkan.

Sekarang, mengapa pengguna UNIX (dan Linux) menyukai shell? Karena Anda dapat mengambil output, memasukkannya ke program lain, dan mendapatkan output yang berbeda. Sebagai contoh:

find | grep burek

Ini adalah dua perintah, finddan grep, satu memberi makan yang lain. finddaftar semua file di folder saat ini dan semua anak, satu per baris, dan grephanya mencetak baris-baris yang berisi burek.

Sekarang, ada hal-hal lain yang lebih kompleks, seperti:

ls -R | sort | uniq

ls -Rdaftar file dalam folder saat ini dan anak, dan sortmengurutkan output. uniqkemudian memberi kita hanya garis yang unik.

Sekarang, sementara Anda bisa mengkodekan semua ini menjadi GUI, Anda dapat dengan cepat melakukan hal-hal rumit dengan baris perintah yang biasanya tidak dapat Anda lakukan dengan GUI kecuali Anda menulis sendiri. Dalam hal ini, lebih cepat untuk mengetikkannya ke dalam baris perintah, bukan?

Bottomline: Jika Anda bertanya ini, Anda tidak membutuhkannya. Baris perintah tidak berguna bagi Anda sebagai pengguna biasa. Baris perintah bagaimanapun bagus untuk sysadmin, untuk pengembang, dan mereka yang ingin main-main dengan komputer mereka dengan cara cepat cepat cepat.

Ivan Vučica
sumber
1

Ya, Anda dapat menjalankan perintah find tanpa shell - Anda memerlukan beberapa program untuk memulainya, dan Anda akan memerlukan beberapa program untuk menampilkan outputnya. Sering kali, Anda menggunakan fitur shell, dan perintah itu akan membutuhkan shell untuk menginterpretasikan maksud.

mis. perpipaan, redirection dan globbing adalah fitur dari shell, dan akan membutuhkan shell untuk menafsirkannya. "find. -name myfile" tidak menggunakan fitur shell, dan dapat dijalankan tanpa shell. "find. -name myfile | sort> output" menggunakan perpipaan dan pengalihan dan Anda perlu shell untuk menafsirkannya.

Adapun untuk melarikan diri xy *, ada sedikit perbedaan jika input untuk menemukan atau output dari rediksi, shell akan memperluasnya dengan cara baik.

Jika ada file bernama xyz di direktori saat ini

temukan. -nama xy * akan benar-benar berjalan sebagai find. -nama xyz, yang mungkin bukan yang Anda inginkan.

Jika Anda menemukan. -nama xy * dan tidak ada file yang cocok dengan xy * di direktori saat ini, ia akan berjalan sebagai find. -nama xy *.

Demikian pula, jika tidak ada file yang cocok dengan xy * di direktori saat ini ls> xy * akan membuat file dengan nama xy *. Jika ada satu file yang cocok - misalnya xyz, itu berarti ls> xyz. Jika ada beberapa file yang cocok dengan xy * maka ls> xy * akan gagal.

Baca lebih lanjut http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

tidak
sumber
Mode baca dimana?
Thomi
1

OS non-sepele tidak menjalankan interpreter baris perintah di kernel.

Mereka menjalankannya sebagai sebuah program, dan program yang disebut sebuah shell. Situasi pada GUI tampaknya bercampur, tetapi setidaknya beberapa OS menjalankannya di luar kernel juga.

Sekarang, sama sekali tidak perlu shell untuk bekerja seperti shell unix, tetapi Anda memang membutuhkan antarmuka.

dmckee
sumber
1

Untuk menjawab pertanyaan kedua Anda ... shell akan berusaha mengembangkan apa pun yang bisa dilakukan kapan pun bisa, kecuali Anda mencegahnya. Melarikan diri dari * mencegah ekspansi, yang biasanya diperlukan untuk perintah find.

Bukan untuk menjawab pertanyaan dengan pertanyaan, bagaimana Anda tahu jika perintah ls adalah daftar file karena perluasan baris perintah atau karena perintah ls secara sah mencari daftar direktori dari sistem file? Sebagai contoh, saya bisa menulis shell untuk loop seperti ini:

for i in $(ls /home/mydir);

atau suka

for i in /home/mydir/*;

mereka akhirnya menghasilkan set yang sama.

KFro
sumber
0
mengapa saya bisa mengetik> ls xy * dan mendapatkan output yang tepat
Saya perlu melarikan diri * dengan \ in find - find. -nama xy \ * Is
shell melakukan ekspansi kartu liar untuk satu dan bukan untuk
dieksekusi lainnya?

Tujuan melarikan diri '*' dalam permohonan find adalah untuk mencegah shell melakukan ekspansi. Dengan menghindarinya, Anda memastikan bahwa find melihat argumen: ".", "-Name", "xy *". Jika Anda tidak lolos dari '*', cari akan melihat ".", "-Nama", "xya", "xyz" (dengan asumsi shell memperluas "xy *" ke "xya xyz", yang akan terjadi jika hanya file yang memulai xy adalah xya dan xyz). Jadi jawaban untuk pertanyaan Anda adalah tidak, shell tidak memperluas '*' dalam permintaan Anda karena Anda secara eksplisit memintanya untuk tidak melarikan diri.

William Pursell
sumber
0

Shell di Linux adalah cara yang mudah dan konvensional untuk berinteraksi dengan sistem file di Linux dan menjalankan perintah dengan argumen dan sehubungan dengan variabel lingkungan. Ini memberikan banyak fitur berguna, misalnya, menghubungkan output dari satu proses ke input lain, mengarahkan input / output stream ke / dari file, FIFOs, dll. Shell adalah cara yang baik untuk dengan mudah menggabungkan beberapa program kecil, masing-masing melakukan tugas yang relatif kecil, untuk memberikan sesuatu yang bermanfaat. Beberapa dari program ini (seperti find dan ls) dirancang untuk bekerja dengannya dalam sebuah shell.

Untuk memahami ekspansi, ingat saja bahwa sebuah kata (urutan ruang-terbatas dari karakter aplhanumerik dan -, dan beberapa simbol lainnya), mengingat mengandung *atau ?karakter pola, tidak lolos atau dimasukkan ke dalam tanda kutip ( ") atau apostrof ', diganti dengan seri kata-kata yang dibatasi ruang dengan nama file yang cocok dengan pola. Jadi seandainya Anda memiliki satu kata dengan tanda bintang, setelah ekspansi Anda akan memiliki nol, satu atau beberapa kata, yang akan diperlakukan oleh bash sebagai beberapa argumen. Di sinilah desain spesifik dari lsperintah: ini cocok dengan skema ini dengan sempurna ketika digunakan ls foo*untuk menampilkan semua file yang dimulai dengan "foo"! Ini diperluas menjadi sesuatu seperti

ls foobar boobaz

dan ls hanya mencetak file dari argumen, memeriksa keberadaan dan melintasi ke folder dll.

Tapi itu kebanyakan masalah filsafat. Di sistem lain semuanya muncul dari tombol "Start" dan taskbar. Beberapa pengguna baik-baik saja dengan itu. Beberapa mencoba untuk menginstal shell yang mirip linux ke dalam sistem tersebut. Itu masalah selera, tetapi untuk pemrograman skrip sederhana, yang berhubungan dengan file, shell sangat nyaman.

P Shved
sumber
0

Untuk perintah interaktif, shell dapat diganti dengan GUI.

Tetapi poin utama shell adalah bahwa itu adalah bahasa skrip: Anda dapat membuat seluruh program yang dieksekusi dalam situasi tertentu (boot, pembukaan sesi, setiap hari, ...). Fitur ini tidak dapat diganti oleh alat lain.

mouviciel
sumber
Dan tentu saja Anda dapat menjadwalkan skrip shell dengancron
Wuffers
0

Tentu saja Anda bisa menjalankan Linux dan tidak pernah menggunakan shell. Out of the box banyak distro Linux standar menawarkan pengguna rumah persis apa yang mereka butuhkan jika mereka hanya ingin memeriksa facebook, melihat gambar dan mengirim email.

Linux memiliki banyak kelebihan, tetapi shell mungkin yang terbaik. Shell memungkinkan pengalihan I / O. Inilah yang orang bicarakan ketika merujuk ke pipa ("|"). Sebagai contoh:

Saya ingin terhubung ke daftar mesin dan melakukan survei di mana akun pengguna ada:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

Mungkin ada 0 host di hostnames.txt atau mungkin ada ribuan. Script ini akan membuka dan melakukan survei, meludah informasi ke stdout.

Scripting bisa menjadi sangat kreatif. Saya dapat menggunakan karakter "/ >>" untuk mengarahkan input / output dari dan ke file. Saya dapat mensurvei semua mesin dalam skrip di atas, menampilkan nama server dari sembarang pengguna yang memiliki file, kemudian menindaklanjuti dengan skrip lain yang menghubungkan dan melakukan beberapa tugas pada akun pengguna (mengunci / membuka / mengatur ulang pw / hapus / tambah grup / dll).

Belajar. Untuk. Naskah. =)

HayekSplosives
sumber