Seberapa baik Anda tahu bash?


Apakah Anda menggunakan shell setiap hari? Siap menyelesaikan beberapa masalah logis dan mempelajari sesuatu yang baru? Selamat datang di kucing.

Beberapa tugas yang disajikan di sini tidak akan membawa manfaat nyata, karena mereka mempengaruhi beberapa kasus batas yang kompleks. Bagian lain akan bermanfaat bagi mereka yang terus menggunakan shell dan membaca skrip orang lain.

Catatan: pada saat penulisan, penulis menggunakan bash 4.4.12 (1) - rilis di subsistem Linux pada Windows 10. Kompleksitas tugas berbeda.

Input / output stream


Tugas 1

$ cat 1 The cake is a lie! Wanted! Cake or alive $ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1 

Berapa banyak baris dalam file 1 setelah perintah?

Jawabannya
1

Penjelasan
Setelah menginterpretasikan perintah, tetapi sebelum menjalankan semua program, bash bekerja dengan aliran input / output yang ditentukan. Dengan demikian, file 1 dihapus sebelum memulai program pertama dan cat membuka file yang sudah dihapus.

Tugas 2

 $ cat file1 I love UNIX! $ cat file2 I don't like UNIX $ cat file1 <file2 

Apa yang akan ditampilkan di layar?

Jawabannya
I love UNIX!

Penjelasan
Beberapa program memalu pada stdin ketika file ditentukan.

Tugas 3

 $ cat file Just for fun $ cat file 1>&2 2>/dev/null 

Apa yang akan ditampilkan di layar?

Jawabannya
Just for fun

Penjelasan
Ada kesalahpahaman bahwa urutan 1>&2 mengalihkan utas pertama ke yang kedua, namun, tidak demikian. Pertimbangkan tim dari penugasan. Di awal interpretasi dari perintah yang dimasukkan, tabel alir terlihat seperti ini:
012
stdinstdoutstderr

bash mendeteksi urutan 1>&2 dan menyalin isi sel 2 ke sel 1:
012
stdinstderrstderr

Setelah mendeteksi urutan 2>/dev/null interpreter menulis nilai ke sel 2, membiarkan sel-sel lain tetap utuh:
012
stdinstderr/ dev / null

bash juga menampilkan aliran kesalahan, sehingga kami menemukan teks file di layar.

Tugas 4
Bagaimana cara mengirim stdout output ke stderr, dan stderr output, sebaliknya, ke stdout?

Jawabannya
4>&1 1>&2 2>&4

Penjelasan
Prinsipnya persis sama dengan tugas sebelumnya. Itu sebabnya kami membutuhkan aliran tambahan untuk penyimpanan sementara.

Dapat dieksekusi


Tugas 5

Diberikan file test.sh

 #!/bin/bash ls $* ls $@ ls "$*" ls "$@" 

Perintah-perintah berikut dijalankan:

 $ ls 1 2 3 test.sh $ ./test.sh 1 2 3 

Apa yang akan dihasilkan skrip?

Jawabannya
1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3


Penjelasan
Tanpa tanda kutip, variabel $ * dan $ @ tidak berbeda dan diperluas ke semua argumen posisi skrip yang diberikan, dipisahkan oleh spasi. Dalam tanda kutip, metode pengungkapan berubah: $ * berubah menjadi "$ 1 $ 2 $ 3", dan $ @ pada gilirannya menjadi "$ 1" "$ 2" "$ 3". Karena file "1 2 3" tidak ada di direktori, ls menampilkan kesalahan

Tugas 6

Di direktori saat ini, buat file -c dengan izin 755 dan konten berikut:

 #!/bin/bash echo $1 

Hilangkan variabel $ PATH dan coba jalankan:

 $ PATH= $ -c "echo SURPRISE" 

Apa yang akan ditampilkan di layar? Apa yang terjadi jika Anda memasukkan kembali perintah terakhir?

Jawabannya
Pertama kali akan ditampilkan SURPRISE , yang kedua kalinya echo SURPRISE

Penjelasan
Jika PATH kosong, shell mulai mencari file di direktori saat ini. -c baru saja ditemukan. Karena file yang dapat dieksekusi adalah file teks, baris pertama dibaca pada subjek shebang. Tim dirakit sesuai dengan templat:

 <shebang> <filename> <args> 

Jadi, sebelum eksekusi, perintah kami terlihat seperti ini:

 /bin/bash -c "echo SURPRISE" 

Dan, sebagai hasilnya, itu sama sekali bukan apa yang ingin kita lakukan.

Jika Anda menjalankannya untuk kedua kalinya, maka shell akan mengambil informasi tentang -c dari cache dan menjalankannya dengan benar. Satu-satunya cara untuk melindungi diri dari efek yang tidak terduga adalah menambahkan dua minus ke shebang.

Variabel


Tugas 7

 $ ls file $ cat <$(ls) $ cat <(ls) 

Apa yang akan ditampilkan dalam kasus pertama dan kedua?

Jawabannya
Yang pertama akan menampilkan isi file file, yang kedua - nama file.

Penjelasan
Dalam kasus pertama, substitusi dilakukan

 cat <file 

Dalam kasus kedua, <(ls) akan diganti oleh pipa bernama yang dihubungkan oleh input ke stdout ls dan output dari stdin cat.

Setelah substitusi, perintah akan berbentuk:

 cat /dev/fd/xx 


Tugas 8

 $ TEST=123456 $ echo ${TEST%56} 

Apa yang akan ditampilkan di layar?

Jawabannya
1234

Penjelasan
Dengan catatan seperti itu, polanya cocok (# - dari awal variabel; ## - dengan rakus dari awal variabel;% - dari akhir variabel; %% - dengan rakus dari akhir variabel) dan dihapus ketika mengganti. Isi variabel tetap utuh. Jadi, misalnya, mudah untuk mendapatkan nama file tanpa ekstensi.

 $ TEST=file.ext $ echo ${TEST%.ext} file 


Tugas 9

 $ echo ${friendship:-magic} 

Apa yang akan ditampilkan di layar?

Jawabannya
Jika variabel persahabatan didefinisikan, maka isi dari variabel tersebut. Kalau tidak, sihir.

Penjelasan
Dalam dokumentasi, sihir ini disebut "tidak disetel atau null" dan memungkinkan Anda untuk menggunakan nilai default variabel dalam satu baris.

Perintah eksekusi


Tugas 10

 while true; false; do echo Success done 

Apa yang akan ditampilkan di layar?

Jawabannya
Tidak ada

Penjelasan
Pernyataan sementara dan jika memungkinkan Anda untuk menjejalkan seluruh urutan tindakan ke dalam kondisi, tetapi hasilnya (kode pengembalian) akan diperhitungkan hanya dalam perintah terakhir. Karena itu salah, loop tidak akan dimulai.

Tugas 11

 $ false && true || true && false && echo 1 || echo 2 

Apa yang akan ditampilkan di layar?

Jawabannya
2

Penjelasan
Tambahkan tanda kurung untuk urutan eksplisit dan sederhanakan perintah, dengan mempertimbangkan bahwa hanya kode pengembalian dari perintah terakhir yang diperhitungkan:

 ((((false && true) || true) && false) && echo 1) || echo 2 (((false || true) && false) && echo 1) || echo 2 ((true && false) && echo 1) || echo 2 (false && echo 1) || echo 2 false || echo 2 echo 2 


Komentar, saran, dan tugas tambahan disambut dalam komentar atau PM.

Source: https://habr.com/ru/post/id413935/


All Articles