
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?
PenjelasanSetelah 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?
PenjelasanBeberapa 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?
PenjelasanAda 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:
bash mendeteksi urutan
1>&2
dan menyalin isi sel 2 ke sel 1:
Setelah mendeteksi urutan
2>/dev/null
interpreter menulis nilai ke sel 2, membiarkan sel-sel lain tetap utuh:
0 | 1 | 2 |
stdin | stderr | / dev / null |
bash juga menampilkan aliran kesalahan, sehingga kami menemukan teks file di layar.
Tugas 4Bagaimana cara mengirim stdout output ke stderr, dan stderr output, sebaliknya, ke stdout?
PenjelasanPrinsipnya persis sama dengan tugas sebelumnya. Itu sebabnya kami membutuhkan aliran tambahan untuk penyimpanan sementara.
Dapat dieksekusi
Tugas 5Diberikan file test.sh
Perintah-perintah berikut dijalankan:
$ ls 1 2 3 test.sh $ ./test.sh 1 2 3
Apa yang akan dihasilkan skrip?
Jawabannya1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3
PenjelasanTanpa 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 6Di direktori saat ini, buat file
-c
dengan izin 755 dan konten berikut:
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?
JawabannyaPertama kali akan ditampilkan SURPRISE
, yang kedua kalinya echo SURPRISE
PenjelasanJika 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?
JawabannyaYang pertama akan menampilkan isi file file, yang kedua - nama file.
PenjelasanDalam 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?
PenjelasanDengan 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?
JawabannyaJika variabel persahabatan didefinisikan, maka isi dari variabel tersebut. Kalau tidak, sihir.
PenjelasanDalam 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?
PenjelasanPernyataan 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?
PenjelasanTambahkan 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.