• Linux'ta G/Ç yönlendirmesi. Program kanalları ve akışları, yönlendirme

    Herhangi bir program, verileri işlemek için tasarlanmış bir "otomattır": bir bilgiyi girdi olarak alırken, çalışma sonucunda başka bir bilgi üretir. Gelen ve / veya giden bilgiler sıfır olsa da, yani basitçe yok. Programa işlenmek üzere iletilen veriler girdi, çalışma sonucunda ürettikleri ise çıktıdır. Her program için girdi ve çıktının organizasyonu, işletim sisteminin görevidir.

    Her program belirli bir türdeki verilerle çalışır: metin, grafik, ses vb. Muhtemelen zaten anladığınız gibi, Linux'taki ana sistem yönetimi arabirimi, metin bilgilerini kullanıcıdan sisteme ve geri aktarmak için tasarlanmış bir terminaldir. Sadece terminalden girip terminale çıkış yapabileceğiniz için metin bilgisi, terminalle ilişkili programların giriş ve çıkışları da metin olmalıdır. Bununla birlikte, metinsel verilerle çalışma ihtiyacı, sistemi kontrol etme yeteneğini sınırlamaz, aksine onları genişletir. Bir kişi herhangi bir programın çıktısını okuyabilir ve sistemde neler olduğunu anlayabilir ve farklı programlar aynı tür veri temsilini kullandıkları için birbirleriyle uyumludur - metin.

    Komutlar ve betikler, giriş verilerini iki şekilde alabilir: standart girişten (klavyeye bağlı) veya bir dosyadan. Veri çıktısında da benzer bir ayrım vardır: Bir komutun veya betiğin sonuçları varsayılan olarak terminal ekranına gönderilir, ancak bunları bir dosyaya yönlendirebilirsiniz. Çalışma sırasında hatalar oluşursa. bunlarla ilgili mesajlar da ekranda görüntülenir, hata akışı da bir dosyaya yönlendirilebilir.

    Önce girdi / çıktıyı düzenleyebileceğiniz birkaç komutu düşünün.

    Standart çıkışa çıkış komutları

    Linux, mesajları standart çıktıya yazdırmak için çeşitli komutlar sağlar:

    • echo - Standart çıktıya bir dize yazın.
    • printf - Biçimlendirilmiş metni standart çıktıya yazdırır.
    • evet - Tekrarlanan metni standart çıktıya yazdırın.
    • seq - Bir sayı dizisini standart çıktıya yazdır
    • temizle Ekranı veya pencereyi temizleyin.

    Örneğin echo komutunu kullanırken \c kontrol karakterini belirtirseniz çıkış tamamlandığında Yeni hat:

    $ echo "Adın ne?\c"

    Adın ne?$

    Burada $ davet karakteridir.

    Hat üzerinde kabuk değişkenlerinin ve hatta diğer komutların değerlerini hesaplamak da mümkündür. Örneğin, aşağıdaki komut size geçerli kullanıcının giriş dizininin ne olduğunu (ortam değişkeni $HOME) ve hangi terminale bağlı olduğunu söyler (tty komutu, yorumlayıcının yürütme sonucunu bir dizeye koyması için ters tırnak içine alınır) .

    $ echo "Ana dizininiz $HOME, bir terminale bağlısınız - `tty` "

    Ana dizininiz /home/knoppix, terminale bağlısınız - /dev/tty1

    Kabuk yorumlayıcısında çift tırnakların özel bir anlamı olduğundan, çıktı dizgisine çift tırnak eklemek için ters eğik çizgi (\) ile bunların tanımlamasını kaldırmanız gerekir. Bu, herhangi bir özel karakterin atanmasını geçersiz kılar.

    Örneğin, "/dev/tty1" dizesini görüntülemek için şunu çalıştırmanız gerekir:

    $echo "\"/dev/tty1\""

    Giriş komutları standart cihaz giriş

    read komutu, standart girdiden tek bir satır okur ve içeriğini belirtilen değişkenlere yazar. Birkaç değişkeni belirtirken, ilk kelime birincisine, ikinci kelime ikinciye vb. yazılır. sonunda - satırın geri kalanı.

    Aşağıdaki komut dosyası, her değişkeni okumak için ayrı bir okuma komutu çağırır.


    $ kedi testi
    #!/bin/bash
    yankı "Ad: \c"
    adı oku
    yankı "Soyadı: \c"
    soyadını oku
    echo “Ad=” $isim “Soyadı=” $soyadı

    Ardından, bu betiği çalıştırmak için, test dosyasına yürütme hakkı vermeniz gerekir: chmod 0755 test ve ./test'i çalıştırın. Yürütme sonucu: Adı: Ivan Soyadı: Petrov Adı=Ivan Soyadı=Petrov

    STANDART GİRİŞ, ÇIKIŞ VE HATA AKIŞLARI

    Kabuktan başlatılan her programın üç açık G/Ç akışı vardır:

    Standart giriş (sldin) - standart çıkış (sldout) - standart hata çıkışı (stderr)

    Varsayılan olarak, bu akışlar bir uç birim ile ilişkilendirilir. Onlar. standart olanların dışında akış kullanmayan herhangi bir program terminal klavyesinden girdi bekleyecek, hata mesajları da dahil olmak üzere bu programın tüm çıktıları terminal ekranında gerçekleşecektir.

    Aynı zamanda, kabuk yorumlayıcısında yürütülen her işlem (komut, komut dosyası, vb.), kendisiyle ilişkili, işlemin verilerini okuyabileceği ve içine yazabileceği bir dizi açık dosyaya sahiptir. Bu dosyaların her biri, dosya tanımlayıcı adı verilen bir numara ile tanımlanır, ancak ilk üç dosya varsayılan G/Ç akışlarıdır:

    Dosya Tanımlayıcı
    Standart giriş 0
    Standart çıkış 1
    Standart Hata Akışı 2

    Gerçekte, 12 açık dosya oluşturulur, ancak tanımlayıcıları 0, 1 ve 2 olan dosyalar standart girdi, çıktı ve hata için ayrılmıştır. Kullanıcılar ayrıca 3 ila 9 (ayrılmış) dosya tanıtıcılarına sahip dosyalarla da çalışabilir.

    Standart giriş (sldin) dosyası, dosya tanıtıcısı 0'a sahiptir. İşlemler girdilerini bu dosyadan alır. Varsayılan olarak, giriş akışı klavyeyle (cihaz /dev/tty) ilişkilendirilir, ancak çoğu zaman diğer işlemlerden veya normal bir dosyadan gelen bir kanaldan gelir.

    Standart çıktı (stdout) dosyası, dosya tanımlayıcı 1'e sahiptir. İşlemden gelen tüm çıktılar bu dosyaya yazılır. Varsayılan olarak, veriler terminal ekranına (device/dev/tty) gönderilir, ancak bir dosyaya yeniden yönlendirilebilir veya bir kanal üzerinden başka bir işleme gönderilebilir.

    Standart hata akışı dosyası (siderr) tanımlayıcı 2'ye sahiptir. Komutun yürütülmesi sırasında oluşan hata mesajları bu dosyaya yazılır. Varsayılan olarak, hata mesajları terminal ekranına (cihaz /dev/tty) yazdırılır, ancak bir dosyaya da yönlendirilebilirler. tahsis etmek neden gereklidir? özel dosya? Mesele şu ki, çok uygun yol komutun sonuçlarından gerçek çıktı verilerini çıkarmanın yanı sıra, çeşitli günlük dosyalarının bakımını etkili bir şekilde organize etmek için iyi bir fırsat.

    Çok sayıda yardımcı program yalnızca standart akışları kullanır. Bu tür programlar için kabuk, giriş/çıkış akışlarını bağımsız olarak yeniden yönlendirmenize izin verir. Örneğin, hata mesajlarını bastırabilir, bir dosyadan giriş veya çıkış ayarlayabilirsiniz.

    Onlar. komutları çağırırken, hata mesajlarının yanı sıra nereden girdi alacağınızı ve çıktıyı nereye göndereceğinizi belirtebilirsiniz. Varsayılan olarak, aksi belirtilmedikçe, terminal ile çalışmak anlamına gelir: veriler klavyeden girilir ve ekranda görüntülenir. Ancak kabuğun, standart akışların farklı dosyalarla ilişkilendirilmesine izin veren bir yeniden yönlendirme mekanizması vardır. Bu durumda, standart hata akışının yeniden yönlendirilmesi sırasında dosya tanıtıcı (2) belirtilmelidir. Giriş ve çıkış akışları için bu gerekli değildir.

    Akış yeniden yönlendirme mekanizmasını kullanmanın yararlı bir özel durumu, ekrandaki gereksiz mesajlardan kurtulmanızı sağlayan /dev/null'a yönlendirmedir. Aynı mekanizmayı kullanarak boş dosyalar oluşturabilirsiniz:

    % cat myfile - geçerli dizinde oluşturur boş dosya dosyam.

    /dev/null - sözde özel bir dosya. "boş cihaz". "Kaydedilen" bilgi miktarına bakılmaksızın, ona yazmak başarılıdır. /dev/null'dan okumak, EOF dosyasının sonunu okumakla eşdeğerdir.

    G/Ç akışlarını yeniden yönlendirme DOS gibi gerçekleştirilir (Daha kesin olarak, DOS OS akış yeniden yönlendirme sözdizimi UNIX'ten alınmıştır) aşağıdaki semboller kullanılarak gerçekleştirilir:

    - standart çıkış akışını yeniden yönlendir
    - ekleme modunda standart çıktı akışının yeniden yönlendirilmesi
    - standart giriş akışını yeniden yönlendir
    - bir sınırlayıcıyla karşılaşılıncaya kadar standart girdiden veri alma

    Bununla birlikte, DOS'tan farklı olarak, iki işlem arasında bir program kanalı oluştururken, UNIX/Linux OS her iki işlemi aynı anda başlatır ve bilgileri sistem arabelleği aracılığıyla (sabit diske ara yazma olmadan) aktarır. Bu nedenle, UNIX/Linux işletim sistemindeki yazılım kanalları çok etkili yol değişme. Bir sistem arabellek taşması durumunda (örneğin, "gönderen" program, bilgileri "alan" programın işleyebileceğinden daha hızlı bir şekilde kanala yazarsa), işletim sistemi, boruya yazan işlemi şu ana kadar otomatik olarak askıya alır: arabellek serbest bırakılır.

    En Yaygın Yönlendirme Operatörleri

    No. Sözdizimi Açıklama
    1 dosya komutu Standart çıktıyı şuraya gönderir: yeni dosya

    2 komut 1 dosya Standart çıktıyı şuraya gönderir: belirtilen dosya

    3 dosya komutu Standart çıktıyı belirtilen dosyaya gönderir (ekleme modu)

    4 komut dosyası 2&1 Belirtilen dosyaya standart çıktı ve hata gönderir.

    5 komut 2 dosya Belirtilen dosyaya standart hata gönderir.

    6 komut 2 dosya Belirtilen dosyaya standart hata gönderir (ekli mod)

    7 komut dosyası 2&1 Belirtilen dosyaya standart çıktı ve hata gönderir (ekli mod)

    8 komut file1 file2 Birinci dosyadan girdi alır ve çıktıyı ikinci dosyaya gönderir

    9 komut dosyası standart girdi olarak belirtilen dosyadan veri alır

    10 komut sınırlayıcı Bir ayırıcıyla karşılaşılıncaya kadar standart girdiden veri alır.

    11 komut &m Dosya tanımlayıcı m'den standart girdi alır

    12 komut &m Standart çıktıyı m dosya tanıtıcısına yönlendirir

    n&m operatörü, n tanımlayıcısına sahip dosyayı, m tanımlayıcısına sahip dosyanın yönlendirildiği yere yeniden yönlendirmenize izin verir. Komut satırında birkaç benzer operatör olabilir ve bu durumda bunlar soldan sağa doğru değerlendirilir.

    exec komutu ve dosya tanımlayıcıların kullanımı

    exec komutu, geçerli kabuğu belirtilen komutla değiştirir. Genellikle geçerli yorumlayıcıyı kapatmak ve başka bir yorumlayıcıyı başlatmak için kullanılır. Ama başka kullanımları da var.

    Örneğin şöyle bir komut

    Yürütme dosyası, belirtilen dosyayı tüm komutların standart girdisi yapar. içinde yürüt
    Etkileşimli mod hiçbir anlam ifade etmez - komut dosyalarında kullanılmak üzere tasarlanmıştır,
    böylece onu izleyen tüm komutlar girdilerini dosyadan okur. Bu durumda
    betiğin sonunda komut olmalıdır

    Exec & - standart giriş akışını (bu durumda bir dosya) kapatır. Benzer bir yaklaşım uygulanır
    ağırlıklı olarak oturum kapatıldığında çalışan komut dosyalarında.

    exec komutu, tanımlayıcısı 0 (stdin) olan bir dosyaya işaretçidir. Bu işaretçi yalnızca komut dosyası sona erdiğinde geri yüklenebilir.
    Komut dosyasının klavyeden veri okumaya devam etmesi gerekiyorsa, kaydetmeniz gerekir.
    eski giriş akışına bir işaretçi. Aşağıda bunun nasıl yapılacağını gösteren küçük bir komut dosyası bulunmaktadır.

    $ kedi f_desc
    #!/bin/bash
    yürütme 3&0 0 dosya
    satırı oku
    satır2 oku
    yürütme 0&3
    yankı $1inel
    yankı $ satır2

    İlk exec komutu, dosya tanımlayıcı 3'teki standart giriş akışına (stdin) bir işaretçi kaydeder.
    (3 ile 9 arasında herhangi bir tamsayıya izin verilir) ve ardından dosya dosyasını okumak için açar. Sonraki iki okuma komutu
    bir dosyadan iki satır metin okuyun. İkinci exec komutu, işaretçiyi standart girdiye geri yükler: şimdi
    dosya ile değil, stdin ile ilişkilendirilir. Son yankı komutları, okunan satırların içeriğini ekranda görüntüler,
    linel ve line2 değişkenlerinde saklanan.

    Komut dosyasının sonucu:
    $ ./ f_desc
    Merhaba!
    Hoşçakal!

    G/Ç cihazının yeniden eşlenmesiyle, bir program çıktısını başka bir programın girdisine yönlendirebilir veya girdi olarak kullanarak başka bir programın çıktısını kesebilir. Böylece, minimum yazılım yükü ile süreçten sürece bilgi aktarımı mümkündür. Pratikte bu, standart giriş ve çıkış aygıtlarını kullanan programlar için işletim sisteminin aşağıdakilere izin verdiği anlamına gelir:

    • program mesajlarının çıktısını ekrana değil (standart çıktı akışı), ancak bir dosyaya veya yazıcıya (çıktı yeniden yönlendirmesi);
    • giriş verilerini klavyeden (standart giriş akışı) değil, önceden hazırlanmış bir dosyadan (giriş yönlendirmesi) okuyun;
    • bir programdan çıkan mesajları başka bir programa girdi olarak iletin (boru veya komut oluşturma).

    İtibaren Komut satırı bu olasılıklar aşağıdaki gibi uygulanır. Herhangi bir komutla çıkan metin mesajlarını komut satırından bir metin dosyasına yönlendirmek için, yapıyı kullanmanız gerekir. komut > dosya adı. Aynı zamanda çıktı için belirtilen dosya zaten varsa, üzerine yazılır (eski içerik kaybolur), yoksa oluşturulur. Ayrıca dosyayı yeniden oluşturamazsınız, ancak komut tarafından çıkan bilgileri mevcut dosyanın sonuna ekleyebilirsiniz. Bunu yapmak için çıktı yeniden yönlendirme komutu aşağıdaki gibi belirtilmelidir: komut >> dosya adı. bir sembol ile< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

    Komut satırında G/Ç yeniden yönlendirme örnekleri

    İşte bazı G/Ç yeniden yönlendirme örnekleri.

    1. Sonuçların çıktısı ping komutları dosyalamak ping ya.ru > ping.txt

    2. için yardım metni ekleme xkopya komutları copy.txt dosyasına: XCOPY /? >> kopya.txt

    Gerekirse, hata mesajları (standart hata akışı) 2> dosyaadı yapısı komutu kullanılarak bir metin dosyasına yönlendirilebilir.Bu durumda, ekranda standart çıktı üretilir. Bilgi mesajlarını ve hata mesajlarını aynı dosyaya çıkarmak da mümkündür. Bu şu şekilde yapılır: komut > dosya adı 2>&1

    Örneğin, aşağıdaki komut hem standart çıktıyı hem de standart hatayı copy.txt dosyasına yönlendirir: XCOPY A:\1.txt C:> kopya.txt 2>&1

    G/Ç'nin üç yönü ayrılmıştır - standart giriş, çıkış ve hata akışı ( stdin, stdout, stderr ). Varsayılan olarak, üç iş parçacığının tümü bir terminalle ilişkilendirilir (ilişkili). Bu durumda program, hatalarla ilgili olanlar da dahil olmak üzere tüm mesajlarını terminalde görüntüler. Kabuk bu standart akışları yeniden yönlendirmenize, G/Ç ayarlamanıza ve akış havuzu oluşturmanıza olanak tanır.

    G/Ç akışlarını yeniden yönlendirme.

    >dosya Standart çıktıyı bir dosyaya yönlendirme dosya

    >>dosya -Standart çıktıyı bir dosyaya yönlendirme dosya dosyanın sonuna eklenir.

    - bir dosyadan standart girdi alma dosya.

    prog1 | prog2 -Prog1 programının çıkış akışını programın giriş akışına geçirmek prog2.

    n>dosya dosya.

    n>>dosya -Tanımlayıcı n ile standart akışı dosyaya yönlendir dosya dosyanın sonuna eklenir.

    n>&m -Akışları tanımlayıcılarla birleştirme N Ve M .

    $ prog1 >/dev/null 2>&1

    /dev/null kendisine yönlendirilen akışı yok eden sözde bir cihazdır.

    Bir programın çıktı akışını diğerinin giriş akışına geçirmek yaygın bir uygulamadır. Örneğin:

    $ gzip -d arşiv.tar.gz | katran -xf

    Dosyanın sıkıştırılmış olduğu yer burasıdır. arşiv.tar.gz , iki arşivleyici ile paketlenmiştir. Yardımcı programdan çıkış akışı gzip yardımcı programa giriş akışına geçti katran . Benzer şekilde, aynı işlem başka bir şekilde gerçekleştirilebilir:

    $ gzip -d arşiv.tar.gz

    $ tar -xf arşiv.tar

    Çünkü dil Bourne Kabuğu prosedürel bir programlama dilidir, diğer benzer diller gibi, komutların yürütme sırasını kontrol etmenize izin veren operatörlere sahiptir. Gerekli operatör, programın ilerideki seyrinin belirlendiği yerine getirilmesine bağlı olarak belirli bir koşulu kontrol etmektir. Bu operatör komuttur. Ölçek. Bu komut bazı koşulları kontrol eder. Takım Ölçek İki arama seçeneği vardır:

    test koşulu

    [ durum ]

    Parantez ile koşul arasında boşluk olması gerektiğine dikkat edilmelidir, aksi takdirde Kabuk "["yi bir komut olarak tanıyamaz Ölçek . Başarıyla tamamlandığında Ölçek İadeler "0" .

    Dosyaları kontrol etme koşulları:

    -f dosyası Dosya "dosya" normal bir dosyadır.

    -d dosyası Dosya " dosya" bir dizindir.
    -c dosyası Dosya "dosya" özel bir dosyadır.
    -r dosyası Dosya "dosya" okuma iznine sahiptir.

    -w dosyası Dosya "dosya" yazma iznine sahiptir.

    -x dosyası Dosya "dosya" yürütme yetkisine sahiptir.

    -s dosyası Dosya "dosya" boş değil.

    Satır doğrulama koşulları:

    dizi1=dizi2 Teller dizi1 Ve dizi2 eşleştir.

    dizi1!=dizi2 Teller dizi1 Ve dizi2 eşleşmiyor.

    -n dizi1 Astar dizi1 var.

    -z dizi1 Astar dizi1 bulunmuyor.

    Tamsayılarla işlem koşulları:

    x -eq y x eşittir y

    x -ne y x y'ye eşit değil

    x -gt y x y'den büyüktür

    x-gey x, y'den büyük veya eşittir

    x -lt y x y'den küçüktür

    x-ley x, y'den küçük veya eşittir

    Bu durumda komut Ölçek dizeleri tam sayı olarak ele alır. Boş bir değer ayrıca boş bir dizeye karşılık gelir.

    Boole işlemleri bağlamda Ölçek

    ! (Olumsuz) Mantıksal "DEĞİL"

    -o (veya) Mantıksal "VEYA"

    -a (ve) Mantık "VE"

    koşullu operatör "eğer"

    Genel form koşullu bir if ifadesinin kullanılması aşağıdaki gibi temsil edilir:

    eğer<условие>

    Daha sonra<список команд>

    [elif<условие>

    Daha sonra<список> ]

    Köşeli parantez içindeki ifadeler isteğe bağlıdır. Onlar. koşullu operatörün en yaygın "kıyılmış" modifikasyonunu hayal edebiliriz:

    eğer<условие>

    Daha sonra<список команд>

    bu durumda, eğer <условие> tamamlandı (tamamlama kodu 0) sonra çalıştırıldı <список команд>. Aksi takdirde <список команд> atlandı.

    Ekstre seçin dava

    Genel olarak, operatör sözdizimi dava aşağıdaki gibi:

    dava<строка>içinde

    Şablon 1)

    ........

    Şablon2)

    ........

    ........

    Anlam <строка> sırayla kalıplarla karşılaştırılır. Bir eşleşme bulunursa, ilgili bölümün komutları yürütülür. Şablonların maske kullanımına izin verdiğine dikkat edilmelidir. Eşleşme bulunamazsa, "*" kalıbına sahip bölümdeki komutlar yürütülür (benzer şekilde varsayılan seçici anahtar V İLE ).

    Örneğin, burada başlatma betiğinin bir parçası BSD UNIX . Burada değişkenler (inetd_enable ve inetd_flags) başka bir dosyadan elde edildi ( rc.conf).

    . /etc/rc.conf

    durumda ($inetd_enable) içinde

    )

    eğer [ -x /usr/sbin/inetd ]; Daha sonra

    /usr/sbin/inetd $inetd_flags

    fi

    ;;

    esac

    Numaralandırma döngüsü deyimi için

    Operatör sözdizimi için

    için<имя>

    <список команд>

    Vurgulanan parça köşeli parantez, eksik olabilir. Şebeke için değerler listesindeki kelimeler kadar döngünün yürütülmesini sağlar. Aynı zamanda, değişken <имя> listedeki kelimelerin değerlerini sırayla alır. Listenin kendisi, diğer komutların çıktılarından oluşturulabilir. Liste eksikse, o zaman <имя> konumsal komut dosyası parametreleri olarak iletilen değerleri kabul eder.

    Gerçek koşullu döngü deyimi sırasında

    Operatör sözdizimi sırasında genellikle aşağıdaki yapıya sahiptir:

    sırasında<условие>

    <список команд>

    Şebeke sırasında parametre değerleri listesi önceden bilinmediğinde tercih edilir. Koşul doğru olduğu sürece komut listesi bir döngüde yürütülür. Döngüye ilk girdiğinizde koşul doğru olmalıdır.

    Yanlış koşullu döngü deyimi değin

    Operatör sözdizimi değin genellikle aşağıdaki yapıya sahiptir:

    değin<условие>

    <список команд>

    Koşul yanlış olduğu sürece komut listesi bir döngüde yürütülür. Döngüye ilk girdiğinizde koşul doğru olmamalıdır. Döngü koşulunun her birinden sonra yanlışlık açısından kontrol edildiğine dikkat edilmelidir. ve döngüdeki ilk yürütülen komut.

    Temel komutlar işletim sistemi UNIX dosyalarla çalışmak

    1. Takım pwd.

    Sözdizimi: pwd .

    Açıklama: Komut, çalışan kabuk için geçerli dizinin adını görüntüler.

    1. Egzersiz.

    Ana dizininizi belirlemek için pwd komutunu kullanın.

    Komutu ve çalışmasının sonucunu rapora yansıtın.

    2. Takım Adam.

    Sözdizimi: Adam İsim.

    Ad, komutun adıdır, yardımcı program, sistem çağrısı, kitaplık işlevi, dosya.

    Tanım : UNIX KILAVUZU - işletim sistemi kılavuzu UNIX. Oradaki bilgiler, yardımcı program kullanılarak çevrimiçi olarak kullanılabilir Adam .

    Görev 2.

    pwd komutuyla ilgili bilgileri görüntülemek için man yardımcı programını kullanın.

    Rapora ekip hakkında kısa bilgiler yazın (Rusça).

    3. Takım CD.

    Sözdizimi: CD dizin_adı.

    Açıklama: Bu, geçerli dizini değiştirme komutudur. DizinAdı, güncel hale getirmek istediğiniz dizinin tam veya ilgili adıdır.

    CD seçenekler olmadan akım ana dizininizi oluşturacaktır.

    Görev 3.

    Geçerli dizini bir düzey yukarı yapın. Kontrol edin, ardından ana dizininize geri dönün. Dizin değişikliğini kontrol edin.

    Raporda yapılan komutların yürütülmesini kaydedin.

    4. Takım ls.

    Sözdizimi: ls dizin_adı

    Açıklama: belirtilen dizinin içeriğini görüntüleme komutu.

    ls parametreler olmadan geçerli dizindeki dosyaların bir listesini yazdırır.

    Ortaya çıkan liste, adları "" simgesiyle başlayan dosyaları içermeyecektir. . ” - çeşitli tarafından oluşturulan dosyalar sistem programları amaçlarınız için. Bakmak tam liste dosyalar komutta belirtilebilir ls "-a" tuşu,

    onlar. ls -a dizin_adı

    Dosya izinleri

    İçindeki her dosyayla işletim sistemi UNIX dosya için "izinler" adı verilen 12 bitlik bir sözcükle ilişkilendirilir.

    Bu kelimenin alt 9 biti, üç bitlik üç grup halinde birleştirilir; her grup, dosya sahibi, kendi grubu ve diğer tüm kullanıcılar için erişim haklarını belirler. Her gruptaki üç bit, dosyayı okuma, isteme ve kullanma hakkından sorumludur.

    Belirli bir dosyaya erişim haklarını öğrenmek için komutu kullanabilirsiniz.

    , Örneğin:

    > ls -l /bin/kedi

    Bir satırın başındaki karakter grubu -rwxr-xr-x dosya türünü gösterir (ilk karakter; eksi, sıradan bir dosyayla uğraştığımız anlamına gelir, harf D bir dizin vb. anlamına gelir) ve sahip için sırasıyla izinler (bu durumda rwx , yani oku, yaz ve çalıştır), grup ve diğerleri (bu durumda r-x , yani yazma izni yok). Böylece dosya /bin/kedi okuma ve yürütme için herhangi bir kullanıcı tarafından kullanılabilir, ancak bunu yalnızca kullanıcı değiştirebilir kök (yani yönetici).

    Dosya izin kelimesini şu şekilde yazabilirsiniz: sekizli sayı(3 karakter - sekizli hane), üç haneli (sahip, grup, diğer kullanıcılar) bu üç haneli sekizli sayıdaki her karakter hakların toplamı olarak oluşturulur: 4 - okuma hakkı, 2 - yazma hakkı, 1 - kullanma ( ikili üçlüden): (111) 2 =2 0 +2 1 +2 2 =(1+2+4) 10 .

    Örneğin, 7 = 1 + 2 + 4 Þ sağ rwx

    4 2 1

    6 = 0 + 2+ 4 Þ hak rw- -

    4 2 0

    Üç haneli bir atama hakkı sayısında: 744 tüm haklar sahip için, salt okunur grup için, salt okunur diğer kullanıcılar için tanımlanmıştır.

    Dosya izinlerini kullanmak için komutu kullanın. chmod örneğin:

    $ chmod 744 filel.c.

    Görev 4.

    a) almak tüm bilgiler ls komutu için man yardımcı programını kullanın. Komutun çıktısını bir metin dosyasına yönlendirin.

    b) Geçerli dizinin tüm içeriğini görüntüleyin ve bu çıktıyı da bir metin dosyasına yönlendirin.

    c) komutu ile ls-l<имя_файла> 4b adımında üzerinde çalıştığınız metin dosyasına erişim haklarıyla ilgili bilgileri çıktılayın ve ardından bu bilgileri aynı metin dosyasına yönlendirin. Vardığın sonucu açıkla.

    5. Takım kedi.

    G/Ç yönlendirmesi.

    Küçük bir metin dosyasının içeriğini ekranda görüntülemek için şu komutu kullanabilirsiniz:

    kedi dosya adı

    Dikkat! Dizin ve ikili dosyaların içeriğini bu şekilde görüntülemeye çalışmayın.

    Büyük bir test dosyası, bir ekip tarafından rahatlıkla görüntülenebilir Daha (kullanım açıklaması bulunabilir UNIX KILAVUZU ). Buradaki komut neden uygun değil? kedi ?

    Bir takımda kedi birden çok dosya adı verilebilir:

    cat dosya1 dosya 2 ... dosya N

    arka arkaya tüm dosyaların içeriği ekranda görüntülenecektir.

    Çıktıyı bir dosyaya yönlendirebilirsiniz:

    cat dosyası 1 dosya 2 > sonuç_dosyası

    Çıktının standart çıktıdan (ekran) bir dosyaya yönlendirilmesi tüm komutlar için standarttır. Standart girdiyi (klavyeden) yeniden yönlendirebilir, örneğin, program için verileri " kullanarak bir dosyadan alabilirsiniz.<”.

    kedi > new_file - klavyeden girdiğiniz içerikle yeni bir metin dosyası oluşturur.

    Veri girişi işlemini iptal edin -

    Görev 5.

    cat ile yeni bir metin dosyası oluşturun ve içeriğini görüntüleyin. Çıktıyı, standart akıştan adını klavyeden girdiğiniz başka bir dosyaya yönlendirin ve işlemin doğru olduğundan emin olun.

    6. Dosyalarla çalışmak için en basit komutlar : cp, rm, mkdir, mv

    Yeni bir dizin oluşturmak için şu komutu kullanın:

    mkdir dizin_adı

    Bir dosyanın içeriğini diğerine kopyalamak için şu komutu kullanın:

    CP kaynak_dosyası hedef_dosyası.

    Takım

    cp dosyası 1 dosya 2 .... dosya N hedef dizini

    bir dosyayı veya dosyaları zaten var olan bir dizine kendi adları altında hedef_dizini kopyalamak için kullanılır. Kopyalanan dosyaların adları yerine şablonlarını kullanabilirsiniz. Kalıplar, meta karakterler kullanılarak belirtilir:

    * - boş karakter de dahil olmak üzere tüm karakter dizileriyle eşleşir.

    Tüm tek karakterler

    [ ...] - parantez içindeki herhangi bir karakterle eşleşir. Eksi ile ayrılmış bir karakter çifti, bir karakter aralığını tanımlar.

    Takım

    cp-r kaynak_dir hedef_dir

    bir dizinin (source_dir) yeni bir dizine (hedef_dir) yinelemeli olarak kopyalanmasına hizmet eder.

    Kopyalama komutlarında isimler yerine şablonları kullanılabilir.

    Takım

    rm dosya 1 dosya 2 .... dosya N

    geçerli dizinden 1 veya daha fazla normal dosyayı kaldırmanıza izin verir.

    İsimler yerine şablonlar kullanılabilir. Komutta bir veya daha fazla dizini içeriğiyle birlikte (yinelemeli silme) silmek istiyorsanız rm anahtarı kullan -R

    Rm-r yön 1 yön 2

    Komutu yeniden adlandır:

    mv kaynak_adı hedef_adı

    Kaynak_adı adlı dosya, hedef_adı adlı dosya olarak yeniden adlandırılır. Bu durumda, komutu çalıştırmadan önce, hedef_adı adlı dosya mevcut olmamalıdır.

    Görev 6.

    Ana dizininizde yeni bir dizin oluşturun. Orada iki satırlık içerikle küçük bir test dosyası düzenleyin:

    “UNIX işletim sisteminde çalışmayı inceliyorum

    Bir komut dosyası düzenleyin.

    Bu dosyanın içeriğini aynı ada sahip ancak /home dizininde bulunan başka bir dosyaya kopyalayın. Kopyalama başarılı olduysa, orijinal olarak oluşturulan dosyayı dizininizden silin. Kullanılan dizinlerin ve dosyaların içeriğini kontrol edin.

    Görev 7.

    1). En basit UNIX OS komutlarıyla etkileşimli çalışma konusunda uzmanlaştığınızda, sıralı yürütmeye karşılık gelen bir komut dosyasıyla bir komut dosyası oluşturmak için Kwriter editörünü kullanın:

    görev 3,

    Görev 4B, 4C,

    görev 5,

    Görev 6.

    Görev 6'da, programın dosyayı başarılı bir şekilde kopyalayıp kopyalamadığını, çıktıyı görüntü ekranında kontrol etmeyi unutmayın. Metin mesajları ve ilgili dizinlerin içerikleri.

    gerekli ki toplu iş dosyası klavyeden veri girişi için yetkin bir talep verilmesi şu komut kullanılarak organize edildi: $ echo - n “query text”.

    2). Komut dosyasını Myscript1 adıyla kaydedin, komutla çalıştırın

    sh Myscript1

    istenen verileri girin ve sonuçları kontrol edin.

    3). Tamamlanan laboratuvar çalışmasına ilişkin, çalışmanızı etkileşimli modda ve komut dosyasıyla birlikte yansıtması gereken, komut dosyasının metni (yorumlarla birlikte) ve ekranda ve dosyalarda elde edilen sonuçlar dahil bir rapor hazırlayın.

    Sistem çağrıları gituid ve getpid

    Programı yürütmek için başlatan kullanıcının tanımlayıcısını bulun - UID ve ait olduğu grubun kimliği ,-GID sistem çağrıları ile yapılabilir getuid() ve getpid() bunları bu programın içinde uygulayarak.

    Sistem çağrısı prototipleri:

    #katmak

    #katmak

    uid_t getuid(geçersiz);

    gid_t getgid(geçersiz);

    Görev 8.

    Programı çalıştıran kullanıcının kimliğini ve kullanıcının grup kimliğini yazdıran bir program yazın, derleyin ve çalıştırın.

    Sonuçları içeren programı rapora dahil edin.

    Kontrol soruları

    1. Dosya kavramı işletim sistemi UNIX . Ev dizini nedir?

    2. Komutları gruplandırmanın yolları nelerdir? Kabuk -tercüman? kullanımına örnekler veriniz.

    3. G/Ç nasıl yönlendirilir?

    4. Komut boru hattı nedir? örnek vermek.

    5. nasıl yapılır Kabuk üzerinde aritmetik işlemler yapmak Kabuk -değişken?

    6. Dosya adları oluşturmak için kurallar nelerdir?

    7. Komut yürütme sonuçlarının değiştirilmesi nasıl yapılır?

    8. Bir dizi nasıl yorumlanır cmd1&cmd2& ?

    9. Bir dizi nasıl yorumlanır cmd1 && cmd2& ?

    10. Bir dizi nasıl yorumlanır cmd1 || cmd2 & ?

    11. İçinde olduğu gibi UNIX tanımlanmış dosya izinleri? Belirli bir dosya için bunları görüntülemek için hangi komut kullanılabilir?

    12. Programı başlatan kullanıcının tanımlayıcısı ve grubunun tanımlayıcısı nasıl belirlenir?

    Laboratuvar işi № 3.

    İşletim sistemindeki işlemler UNIX.

    işin amacı

    Dildeki programlarda kullanılan sistem çağrılarını kullanarak süreçlerin nasıl oluşturulacağını ve süreçlerin kullanıcı bağlamının nasıl değiştirileceğini öğrenin İLE, V işletim sistemi UNIX.

    1. Süreçlerin organizasyonunu inceleyin UNIX : süreç kavramı, süreç bağlamı, yaşam döngüsü süreç, süreçlerin tanımlanması, süreçlerin hiyerarşik yapısı. yaz İLE ve görev 1'e göre programın hatalarını ayıklayın.

    2. Kendinizi bir süreç yaratmaya alıştırın. UNIX , organizasyonu ile sürecin tamamlanması. Bir program yazın ve hata ayıklayın (dil İLE ) Görev 2'ye uygun olarak, bunu rapora dahil edin.

    3. Fonksiyon parametrelerini inceleyin ana() dilde İLE , Ortam Değişkenleri ve komut satırı bağımsız değişkenleri. dilde bir program yaz İLE Görev 3'e uygun olarak hata ayıklayın ve sonuçlarla birlikte rapora ekleyin.

    4. Bir sistem çağrısı düzenlemek için işlev ailesini inceleyin yürütme().

    5. Dilde bir program yazın İLE öğretmen tarafından yayınlanan Görev 4 versiyonuna uygun olarak, programın hatalarını ayıklayın ve sonuçları öğretmene gösterin. Sonuçları içeren programı rapora dahil edin.

    6. Kontrol sorularını yanıtlayarak öğretmenin çalışmasını koruyun.

    Veri yazmak için dosya veya oradan okuyun, işlemin önce bu dosyayı açması gerekir (yazmak için açarken, önce onu oluşturmanız gerekebilir). Bu süreci verir tanımlayıcı açık bir dosyanın (tanımlayıcısı) - tüm yazma işlemlerinde kullanacağı bu işlem için benzersiz bir sayı. Birinci açık dosya kolu alacak, ikincisi 1 alacak ve böyle devam edecek. Dosya ile bittiğinde, işlem kapatır tutamak serbestken ve yeniden kullanılabilirken. Bir işlem dosyaları kapatmadan çıkarsa, sistem onun yerine yapar. Açıkça söylemek gerekirse, yalnızca tanımlayıcı açma işlemi hangi dosyanın kullanılacağını belirtir. Hem sıradan dosyalar hem de delik dosyaları (çoğunlukla uçbirimler) bir "dosya" olarak kullanılır ve kanallar Pipeline..Pipeline'da açıklanmıştır. Diğer işlemler - okuma, yazma ve kapatma, olduğu gibi tanımlayıcıyla çalışın veri akışı, ancak bu akışın tam olarak nereye gittiği önemli değil.

    Her Linux işlemi başlangıçta alır üç sistem tarafından kendisine açılan "dosya"dır. İlki (kol) açık okuma, Bu standart giriş işlem. Bir dosya tanımlayıcı belirtmezlerse, tüm okuma işlemleri standart girdiyle çalışır. İkincisi (tanımlayıcı 1) yazılmaya açık, bu standart çıktı işlem. Dosya tanımlayıcı açıkça belirtilmemişse, tüm yazma işlemleri onunla çalışır. Son olarak, üçüncü veri akışı (tanımlayıcı 2), teşhis mesajlarını görüntülemek için tasarlanmıştır, buna denir standart hata çıkışı. Bu üç dosya tanıtıcısı, işlem başladığında zaten açık olduğundan, işlemin kendisi tarafından açılan ilk dosya büyük olasılıkla dosya tanıtıcısı 3'e sahip olacaktır.

    İşlem tarafından açılan veri akışının tanıtıcısı. Tanımlayıcılar başlayarak numaralandırılır. Yeni bir veri akışı açıldığında, tanıtıcısına şu anda kullanılmayan sayıların en küçüğü verilir. Önceden açılmış üç tanımlayıcı: standart giriş (), standart çıktı(1) ve standart hata çıkışı(2) başlangıçta bir işleme verilir.

    Kopyalama mekanizması çevre, derste açıklanan, diğer şeylerin yanı sıra, ana sürecin tüm açık tanıtıcılarının çocuğa kopyalanmasını ima eder. Sonuç olarak, hem üst hem de alt süreçler aynı tanıtıcılar altında aynı veri akışlarına sahiptir. ne zaman başlar Başlangıç komut yorumlayıcısı , önceden açılmış üç tanımlayıcı da onunla ilişkilendirilir terminal(daha doğrusu karşılık gelen tty tipi delik dosyası ile): kullanıcı klavyeden komutları girer ve ekranda mesajları görür. Bu nedenle, kabuktan çalıştırılan herhangi bir komut aynı uçbirime çıktı verir ve çalıştırılan herhangi bir komut etkileşimli olarak(arka planda değil) - oradan girin.

    standart çıkış

    Methodius, bazı programların yalnızca terminale değil, aynı zamanda bir dosyaya, örneğin, belirtirken bilgi çıktısı alabildiği gerçeğiyle zaten karşılaştı. parametrik anahtar Ardından bir dosya adının geldiği " -o ", kılavuz metnini monitörde görüntülemek yerine bir dosyaya çıkarır. Programın geliştiricileri böyle bir anahtar sağlamasa bile, Methodius programın çıktısını monitörde görüntülemek yerine bir dosyaya kaydetmenin başka bir yolunu da biliyor: ">" işaretini koyun ve ardından dosya adını belirtin. . Böylece, Methodius zaten kısa oluşturdu metin dosyaları(komut dosyaları) cat yardımcı programını kullanarak (Dosyalara ve Dizinlere İşlem Erişimi bölümüne bakın).

    $ cat > textfile Bu bir örnek dosyadır. ^D $ ls -l textfile -rw-r--r-- 1 metody metody 23 Kasım 15 16:06 textfile

    Örnek 2. Standart çıktıyı bir dosyaya yönlendirme

    Tabii ki, kedi yardımcı programının olanakları, "\u003e" sembolünün kullanımından genişlemedi. Ayrıca, bu örnekteki cat, komut kabuğu seçenek yok: ">" işareti yok, sonraki dosya adı yok. Bu durumda, cat her zamanki gibi çalıştı, çıktının nerede biteceğini bilmeden (ve hatta ilgilenmeden!): monitör ekranında, bir dosyada veya başka bir yerde. Çıktıyı nihai hedefe (ister bir kişi ister bir dosya olsun) teslim etmekle ilgilenmek yerine, cat tüm verileri şu adrese gönderir: standart çıktı(stdout olarak kısaltılır).

    Standart çıktıyı değiştirmek, kabuğun görevidir. İÇİNDE bu örnek Kabuk, ">" işaretinden sonra adı belirtilen boş bir dosya oluşturur ve bu dosyanın dosya tanıtıcısı 1 numaralı cat programına iletilir ( standart çıktı). Bu çok basit bir şekilde yapılır. Dosyalara ve Dizinlere Erişim İşlemlerinde, komutların kabuktan nasıl çalıştırıldığı hakkında konuştuk. Özellikle, fork() yürütüldükten sonra, biri - çocuk - kendisi yerine komutu çalıştırması gereken (exec()) iki özdeş süreç görünür. Yani ondan önce kapatır standart çıktı (tanımlayıcı 1 serbest bırakılır) ve açılır dosya (ilişkili Birinci serbest tanımlayıcı, yani 1) ve çalıştırılan komutun hiçbir şey bilmesine gerek yoktur: standart çıktısı zaten değiştirilmiştir. Bu işlem denir yönlendirmek standart çıktı. Dosyanın zaten mevcut olması durumunda, kabuk daha önce içerdiği her şeyi tamamen yok ederek dosyanın üzerine yazacaktır. Bu nedenle, Methodius'un textfile dosyasına veri yazmaya devam etmesi için başka bir işleme - ">>" ihtiyacı olacaktır.

    $ cat >> textfile Örnek 1. ^D $ cat textfile Bu örnek dosyadır. Örnek 1. $

    Örnek 3. Tahribatsız stdout yönlendirmesi

    Methodius tam olarak ihtiyaç duyduğu sonucu aldı: mevcut bir dosyanın sonuna bir sonraki komutun standart çıktısından veri ekledi.

    standart çıktı Başlatma sırasında her işlem için sistem tarafından açılan ve işlemin veri çıkışı için amaçlanan veri akışı.

    standart giriş

    Benzer şekilde, programın girişine veri iletmek için standart giriş(stdin olarak kısaltılır). Komut satırıyla çalışırken, standart giriş, kullanıcının klavyeden girdiği karakterlerdir. Standart girdi, bir dosyadan veri besleyerek bir komut kabuğu kullanılarak yeniden yönlendirilebilir. Sembol "< » служит для перенаправления содержимого файла на стандартный ввод программе. Например, если вызвать утилиту sort без параметра, она будет читать строки со стандартного ввода. Команда « sort < имя_файла” dosyadan giriş sıralama verileri verecektir.

    $ sıralama< textfile Пример 1. Это файл для примеров. $

    Örnek 4. Bir dosyadan standart girişi yeniden yönlendirme

    Bu komutun sonucu sort textfile komutuyla tamamen aynıdır, aradaki fark "< », sort получает данные со стандартного ввода, ничего не зная о файле « textfile », откуда они поступают. Механизм работы shell в данном случае тот же, что и при перенаправлении вывода: shell читает данные из файла « textfile », запускает утилиту sort и передаёт ей на стандартный ввод содержимое файла.

    "\u003e" işleminin olduğunu hatırlamakta fayda var yıkıcı: her zaman sıfır uzunlukta bir dosya oluşturur. Bu nedenle, örneğin, verileri sıralama dosyada sıralı olarak uygulanmalıdır sıralama < файл >yeni dosya ve mv yeni_dosya dosyası. Komutu görüntüle takım< файл >same_file sadece sıfır uzunluğa kısaltın!

    Standart girdi Başlatma sırasında her işlem için sistem tarafından açılan ve girdi amaçlı veri akışı.

    Standart Hata Çıkışı

    İlk örnek ve yeniden yönlendirme alıştırması olarak Methodius, cat.info dosyasına cat için bir kılavuz yazmaya karar verdi:

    $ info cat > cat.info info: Düğüm girişi (coreutils.info.bz2)cat çağrısı... info: Tamamlandı. $ head -1 cat.info Dosya: coreutils.info, Düğüm: cat çağırma, Sonraki: tac çağırma, Yukarı: Tüm dosyaların çıktısı $

    Örnek 5. Standart Hata Çıkışı

    Methodius şaşırarak, bir dosyaya gitme talimatına rağmen, info komutu tarafından yazdırılan iki satırın hala terminale girdiğini keşfetti. Belli ki bu hatlar tutmadı standart çıktı programın çıkarması gereken kılavuzla doğrudan ilgili olmadıkları için, kullanıcıya işin ilerleyişi hakkında bilgi verirler: kılavuzu bir dosyaya yazmak. bu tür için tanı mesajları Linux, programın yürütülmesi sırasında oluşan hata mesajlarının yanı sıra standart hata çıkışı(stderr olarak kısaltılır).

    standart hata çıkışı Sistem tarafından her işlem için başlatıldığı sırada açılan ve amaçlanan veri akışı tanı mesajları süreç tarafından çıktı.

    Standart hata çıktısını standart çıktıyla birlikte kullanmak, programın gerçek sonucunu çeşitli eşlik eden bilgilerden ayırmanıza olanak tanır, örneğin bunları şu adrese göndererek: farklı dosyalar. Standart hata çıkışı, " 2 " karakter kombinasyonu kullanılarak standart giriş/çıkışla aynı şekilde yeniden yönlendirilebilir.

    $ info cat > cat.info 2> cat.stderr $ cat cat.stderr info: Düğüm girişi (coreutils.info.bz2)cat çağrısı... info: Tamamlandı. $

    Örnek 6. Yönlendirme standart hatası

    Bu kez terminale hiçbir şey ulaşmadı, standart çıktı cat.info dosyasına gitti, standart hata çıktısı cat.stderr dosyasına gitti. ">" ve "2" yerine Methodius "1>" ve "2>" yazabilirdi. Bu durumda sayılar, tanımlayıcıların sayısını gösterir. açıldı Dosyalar. Bazı yardımcı programlar almayı bekliyorsa açık bir sayı ile tanımlayıcı, diyelim ki, 4 , ardından çalıştırmak için zorunlu olarak"4>" kombinasyonunu kullanmanız gerekecek.

    Ancak bazen stdout ve stderr'i ayırmak yerine aynı dosyada birleştirmek istersiniz. İÇİNDE kabuk bash bunun için özel bir " 2>&1 " dizisine sahiptir. Bu, "standart hatayı standart çıktıyla aynı yere aktar" anlamına gelir:

    $ info cat > cat.info 2>&1 $ head -3 cat.info info: Düğümü yaz (coreutils.info.bz2)cat çağırma... bilgi: Tamamlandı. Dosya: coreutils.info, Düğüm: cat çağrısı, Sonraki: tac çağrısı, Yukarı: Tüm dosyaların çıktısı $

    Örnek 7. Standart çıkışı ve standart hata çıkışını birleştirme

    Bu örnekte yönlendirmelerin sırası önemlidir: Methodius komut satırında önce standart çıktının nereye yönlendirileceğini (" > cat.info ") belirtti ve ancak bundan sonra standart hatanın oraya da gönderilmesini emretti. Bunun tersini yapın (“ 2>&1 > cat.info ”), sonuç beklenmedik olur: dosyaya yalnızca standart çıktı girer ve terminalde tanılama mesajları görünür. Bununla birlikte, buradaki mantık sağlamdır: “ 2>&1 ” işlemi sırasında, standart çıkış terminale bağlanmıştır, bu şu anlama gelir: sonrasında yürütüldüğünde, standart hata çıkışı da terminal ile ilişkilendirilecektir. Ve standart çıktının daha sonra bir dosyaya yeniden yönlendirilmesi, elbette standart hatayı hiçbir şekilde etkilemeyecektir. &number yapısındaki sayı sayıdır açık tanımlayıcı Dördüncü tanımlayıcıya yazan yukarıda belirtilen yardımcı program kabukta yazılmış olsaydı, " >&4 " yönlendirmelerini kullanırdı. Hantal “> dosya 2>&1” yapısını yazmaktan kaçınmak için bash kısaltmalar kullanır: “ &> dosya ” veya eşdeğer olarak “>& dosya ”.

    Hiçbir yere yönlendirme

    Bazen program tarafından bazı veri çıktılarının gerekli olmayacağı bilinmektedir. Örneğin, standart hata çıkışından gelen uyarılar. Bu durumda, standart hata çıktısını şuraya yönlendirebilirsiniz: delik dosyası, özellikle veri imhası için tasarlanmıştır - /dev/null . Bu dosyaya yazılan her şey basitçe atılacak ve hiçbir yerde saklanmaz.

    $ bilgi kedi > cat.info 2 > /dev/null $

    Örnek 8. /dev/null'a yönlendir

    Aynı şekilde standart çıktıyı /dev/null'a göndererek kurtulabilirsiniz.

    Hangi komut satırı komut dosyalarının çıktısını almanın iki yöntemine zaten aşinasınız:

    • Çıkış verilerinin ekranda görüntülenmesi.
    • Çıktıyı bir dosyaya yönlendirme.
    Bazen ekranda bir şey göstermeniz ve bir dosyaya bir şey yazmanız gerekir, bu nedenle Linux'un girdi ve çıktıyı nasıl işlediğini anlamanız gerekir, bu da komut dosyalarının sonuçlarını ihtiyacınız olan yere nasıl göndereceğinizi öğrenmek anlamına gelir. Standart dosya tanımlayıcılardan bahsederek başlayalım.

    Standart dosya tanımlayıcıları

    Linux'ta girdi ve çıktı dahil her şey dosyadır. işletim sistemi tanımlayıcıları kullanarak dosyaları tanımlar.

    Her işleme en fazla dokuz açık dosya tanıtıcıya izin verilir. Bash kabuğu, kimlikleri 0, 1 ve 2 olan ilk üç tanımlayıcıyı ayırır. İşte ne anlama geldikleri.

    • 0 , STDIN - standart giriş akışı.
    • 1 , STDOUT - standart çıkış akışı.
    • 2 , STDERR - standart hata akışı.
    Bu üç özel tutamaç, bir komut dosyasındaki verilerin girişini ve çıkışını işler.
    Standart akışları doğru bir şekilde anlamanız gerekir. Komut dosyalarının dış dünyayla etkileşime girdiği temelle karşılaştırılabilirler. Onlarla ilgili ayrıntılara bakalım.

    STDIN

    STDIN, kabuğun standart giriş akışıdır. Bir terminal için standart giriş klavyedir. Komut dosyaları giriş yönlendirme karakterini kullandığında -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

    Birçok bash komutu, komut satırında girdi alınacak dosya belirtilmemişse STDIN'den girdi kabul eder. Örneğin, bu cat komutu için geçerlidir.

    Komut satırına seçenekler olmadan cat komutunu yazdığınızda, STDIN'den girdi alır. Bir sonraki satırı girdikten sonra, cat bunu ekrana yazdırır.

    STDOUT

    STDOUT, kabuğun standart çıktı akışıdır. Varsayılan olarak bu ekrandır. Bash komutlarının çoğu STDOUT olarak çıkar ve bu da onun konsolda görünmesine neden olur. Veriler, >> komutu kullanılarak içeriğine eklenerek bir dosyaya yönlendirilebilir.

    Bu nedenle, bu komutu kullanarak başka veriler ekleyebileceğimiz bazı veri dosyalarımız var:

    Pwd >> dosyam
    Myfile dosyasına hangi pwd çıktıları eklenecek ve zaten içindeki verileri olduğu gibi bırakacak.

    Komut çıktısını bir dosyaya yönlendirme

    Şimdiye kadar çok iyi, ama ya aşağıdaki gibi bir şey yapmaya çalışırsanız, var olmayan bir xfile dosyasına erişirseniz ve bunun tamamen myfile dosyasına bir hata mesajı koymakla ilgili olduğunu düşünürseniz.

    ls –l xfile > dosyam
    Bu komutu çalıştırdıktan sonra ekranda hata mesajları göreceğiz.


    Var olmayan bir dosyaya erişme girişimi

    Var olmayan bir dosyaya erişme girişimi bir hata oluşturur, ancak kabuk hata mesajlarını ekrana yazdırarak dosyaya yönlendirmez. Ancak hata mesajlarının dosyaya girmesini istedik. Ne yapalım? Cevap basit - üçüncü standart tanımlayıcıyı kullanın.

    STDERR

    STDERR, kabuğun standart hata akışıdır. Varsayılan olarak, bu tutamaç STDOUT'un işaret ettiği aynı şeyi işaret eder, bu nedenle bir hata oluştuğunda ekranda bir mesaj görürüz.

    Diyelim ki hata mesajlarını ekranda görüntülemek yerine örneğin bir günlük dosyasına veya başka bir yere yönlendirmek istiyoruz.

    ▍Hata akış yönlendirmesi

    Bildiğiniz gibi STDERR dosya tanıtıcısı 2'dir. Bu tanımlayıcıyı redirect komutunun önüne koyarak hataları yönlendirebiliriz:

    ls -l xfile 2>dosyam kedi ./dosyam
    Hata mesajı şimdi dosyama gidecek.


    Bir hata mesajını bir dosyaya yönlendirme

    ▍Yönlendirme hatası ve çıkış akışları

    Komut satırı komut dosyaları yazarken, hem hata mesajı yeniden yönlendirmesini hem de standart çıktı yeniden yönlendirmesini düzenlemeniz gerektiğinde bir durum ortaya çıkabilir. Bunu başarmak için, uygun tanımlayıcılar için yeniden yönlendirme komutlarını kullanmanız, hataların ve standart çıktının gitmesi gereken dosyaları belirtmeniz gerekir:

    ls -l dosyam xfile başka bir dosya 2> hata içeriği 1> doğru içerik

    Yönlendirme hataları ve standart çıktı

    Kabuk, ls komutunun normalde STDOUT'a gönderdiği şeyi 1> yapısı sayesinde doğru içerik dosyasına yönlendirecektir. STDERR'yi vuracak hata mesajları, 2> yönlendirme komutu nedeniyle errorcontent dosyasında sona erer.

    Gerekirse, hem STDERR hem de STDOUT, &> komutu kullanılarak aynı dosyaya yönlendirilebilir:


    STDERR ve STDOUT'u aynı dosyaya yönlendirme

    Komutu çalıştırdıktan sonra, STDERR ve STDOUT için ne kastedildiği içerik dosyasında sona erer.

    Komut dosyalarındaki çıktıyı yeniden yönlendirme

    Komut satırı betiklerinde çıktıyı yeniden yönlendirmek için iki yöntem vardır:
    • Geçici yeniden yönlendirme veya tek satırlık çıkış yeniden yönlendirmesi.
    • Komut dosyasındaki veya bir kısmındaki tüm çıktıların kalıcı olarak yeniden yönlendirilmesi veya yeniden yönlendirilmesi.

    ▍Geçici çıkış yeniden yönlendirmesi

    Bir komut dosyasında, tek bir satırın çıktısını STDERR'ye yönlendirebilirsiniz. Bunu yapmak için, tanımlayıcı numarasının önüne bir ve işareti (&) karakteri koyarak STDERR tanımlayıcısını belirterek yönlendirme komutunu kullanmak yeterlidir:

    #!/bin/bash echo "Bu bir hata" >&2 echo "Bu normal çıktı"
    Komut dosyasını çalıştırırsanız, her iki satır da ekranda görüntülenecektir, çünkü zaten bildiğiniz gibi hatalar varsayılan olarak normal verilerle aynı yerde görüntülenir.


    Geçici yönlendirme

    Komut dosyasını çalıştıralım, böylece STDERR çıktısı bir dosyada sonlanır.

    ./myscript 2> dosyam
    Gördüğünüz gibi, artık konsola olağan çıkış yapılıyor ve hata mesajları dosyaya gidiyor.


    Hata mesajları bir dosyaya yazılır

    ▍Kalıcı çıkış yeniden yönlendirmesi

    Bir komut dosyasının çok sayıda çıktıyı ekrana yönlendirmesi gerekiyorsa, her yankı çağrısına uygun komutu eklemek zahmetlidir. Bunun yerine, exec komutunu kullanarak çıktının komut dosyası süresince belirli bir tanımlayıcıya yönlendirilmesini ayarlayabilirsiniz:

    #!/bin/bash exec 1>outfile echo "Bu," echo "tüm çıktılarının bir kabuk komut dosyasından başka bir dosyaya yeniden yönlendirilmesi testidir." yankı "her satırı yeniden yönlendirmek zorunda kalmadan"
    Senaryoyu çalıştıralım.


    Tüm çıktıyı bir dosyaya yönlendirme

    Çıkış yeniden yönlendirme komutunda belirtilen dosyaya bakarsanız, yankı komutları tarafından çıkarılan her şeyin bu dosyada sona erdiği ortaya çıkar.

    exec komutu sadece betiğin başında değil, başka yerlerde de kullanılabilir:

    #!/bin/bash exec 2>myerror echo "Bu," echo "komut dosyasının başlangıcıdır, şimdi tüm çıktıları başka bir konuma yönlendiriyor" exec 1>myfile echo "Bu," echo "dosya dosyama gitmeli ve bu gitmeli myerror dosyasına" >&2
    İşte betiği çalıştırdıktan ve çıktıyı yönlendirdiğimiz dosyalara baktıktan sonra olan şey.


    Çıktıyı farklı dosyalara yönlendirme

    exec komutu önce çıktıyı STDERR'den myerror dosyasına yönlendirir. Birkaç yankı komutunun çıktısı daha sonra STDOUT'a gönderilir ve ekrana yazdırılır. Bundan sonra exec komutu STDOUT'a isabet eden her şeyi myfile dosyasına gönderiyor ve son olarak echo komutunda redirect to STDERR komutunu kullanıyoruz, bu da karşılık gelen satırın myerror dosyasına yazılmasına neden oluyor.

    Bu konuda uzmanlaştığınızda, çıktıyı istediğiniz yere yönlendirebileceksiniz. Şimdi giriş yönlendirme hakkında konuşalım.

    Betiklerdeki girişi yeniden yönlendirme

    Girdiyi yönlendirmek için, çıktıyı yönlendirmek için kullandığımız tekniğin aynısını kullanabilirsiniz. Örneğin, exec komutu bir dosyayı STDIN için veri kaynağı yapmanızı sağlar:

    Yürütme 0< myfile
    Bu komut, kabuğa girdinin düz STDIN yerine dosyam dosyası olması gerektiğini söyler. Giriş yönlendirmesini çalışırken görelim:

    #!/bin/bash yürütme 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
    Komut dosyasını çalıştırdıktan sonra ekranda görünecek olan budur.


    Giriş yönlendirmesi

    Daha önceki bir gönderide, klavyeden kullanıcı girişini okumak için read komutunu nasıl kullanacağınızı öğrenmiştiniz. Veri kaynağını bir dosya yaparak girişi yeniden yönlendirirseniz, read komutu STDIN'den veri okumaya çalışırken onu klavyeden değil bir dosyadan okuyacaktır.

    Bazı Linux yöneticileri, günlük dosyalarını okumak ve işlemek için bu yaklaşımı kullanır.

    Kendi Çıktı Yönlendirmenizi Oluşturma

    Betiklerde girdi ve çıktıyı yeniden yönlendirerek, üç standart dosya tanıtıcıyla sınırlı kalmazsınız. Daha önce de belirtildiği gibi, dokuz adede kadar açık tanıtıcınız olabilir. 3'ten 8'e kadar numaralandırılmış kalan altısı, girdi veya çıktıyı yeniden yönlendirmek için kullanılabilir. Bunlardan herhangi biri bir dosyaya atanabilir ve betik kodunda kullanılabilir.

    exec komutunu kullanarak çıkış verilerine bir tanıtıcı atayabilirsiniz:

    #!/bin/bash exec 3>myfile echo "Bu," echo "ekranında görüntülenmeli ve bu," >&3 echo "dosyasında saklanmalı ve bu, ekrana geri dönmelidir"
    Betiği çalıştırdıktan sonra, çıktının bir kısmı ekrana, bir kısmı da tanımlayıcı 3'e sahip bir dosyaya gidecektir.


    Çıktıyı kendi tanıtıcınızı kullanarak yeniden yönlendirme

    Giriş için dosya tanımlayıcıları oluşturma

    Bir komut dosyasındaki girdiyi, çıktıyı yeniden yönlendirebildiğiniz gibi yeniden yönlendirebilirsiniz. Girişi yeniden yönlendirmeden önce STDIN'i başka bir tanımlayıcıda saklayın.

    Dosyayı okumayı bitirdikten sonra, STDIN'i geri yükleyebilir ve her zamanki gibi kullanabilirsiniz:

    #!/bin/bash yürütme 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
    Senaryoyu test edelim.


    Giriş yönlendirmesi

    Bu örnekte, STDIN referansını depolamak için dosya tanımlayıcı 6 kullanılmıştır. Ardından giriş yeniden yönlendirmesi yapıldı, dosya STDIN için veri kaynağı oldu. Bundan sonra, okuma komutunun girişi yeniden yönlendirilen STDIN'den, yani dosyadan geldi.

    Dosyayı okuduktan sonra, tanımlayıcı 6'ya yönlendirerek STDIN'i orijinal durumuna sıfırlıyoruz. Şimdi, her şeyin doğru çalışıp çalışmadığını kontrol etmek için komut dosyası kullanıcıya bir soru sorar, klavye girişi için bekler ve girilenleri işler.

    Dosya Tanımlayıcıları Kapatma

    Komut dosyası sona erdikten sonra kabuk, dosya tanımlayıcılarını otomatik olarak kapatır. Ancak bazı durumlarda, komut dosyası bitmeden tutamaçları manuel olarak kapatmak gerekir. Bir tanıtıcıyı kapatmak için &- konumuna yönlendirilmelidir. Şuna benziyor:

    #!/bin/bash exec 3> myfile echo "Bu bir test veri satırıdır" >&3 exec 3>&- echo "Bu işe yaramaz" >&3
    Komut dosyasını çalıştırdıktan sonra bir hata mesajı alacağız.


    Kapalı bir dosya tanıtıcıya erişme girişiminde bulunuldu

    Mesele şu ki, var olmayan bir tanımlayıcıya atıfta bulunmaya çalıştık.

    Betiklerdeki dosya tanımlayıcıları kapatırken dikkatli olun. Verileri bir dosyaya gönderip ardından tanıtıcıyı kapatıp tekrar açtıysanız, kabuk mevcut dosyayı yenisiyle değiştirir. Yani, bu dosyaya daha önce yazılmış olan her şey kaybolacaktır.

    Açık tanıtıcılar hakkında bilgi alma

    Linux'ta açık olan tüm tanıtıcıların bir listesini almak için lsof komutunu kullanabilirsiniz. Fedora gibi birçok dağıtım, /usr/sbin içinde lsof yardımcı programına sahiptir. Bu komut, sistemde açık olan her tutamaç hakkında bilgi yazdırdığı için oldukça kullanışlıdır. Bu, arka planda çalışan işlemler tarafından açılanları ve oturum açmış kullanıcılar tarafından açılanları içerir.

    Bu komutun birçok tuşu var, en önemlilerine bakalım.

    • -p Bir işlem kimliği belirlemenizi sağlar.
    • -d Hakkında bilgi almak için tanımlayıcı numarasını belirtmenizi sağlar.
    Geçerli işlemin PID'sini bulmak için, kabuğun geçerli PID'yi yazdığı özel ortam değişkeni $$'ı kullanabilirsiniz.

    -a seçeneği, diğer iki seçenek kullanılarak döndürülen sonuçlar üzerinde mantıksal bir AND işlemi gerçekleştirmek için kullanılır:

    lsof -a -p $$ -d 0,1,2

    Açık tutamaçlarla ilgili bilgileri görüntüleme

    STDIN , STDOUT ve STDERR ile ilişkili dosyaların türü CHR'dir (karakter modu). Hepsi bir uçbirime işaret ettiğinden, dosya adı uçbirime atanan aygıtın adıyla eşleşir. Üç standart dosya da hem okuma hem de yazma için kullanılabilir.

    Standart tutamaçlara ek olarak başka tanıtıcıların açık olduğu bir betikten lsof komutunu çağırmaya bakalım:

    #!/bin/bash yürütücü 3> dosya1 yürütücü 6> dosya2 yürütücü 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
    İşte bu komut dosyasını çalıştırdığınızda ne olur.


    Bir komut dosyası tarafından açılan dosya tanımlayıcıları görüntüleme

    Komut dosyası, çıktı (3 ve 6) için iki tutamaç ve giriş (7) için bir tutamaç açtı. Tanımlayıcıları yapılandırmak için kullanılan dosyaların yolları da burada gösterilmektedir.

    Çıkış bastırma

    Bazen, örneğin bir arka plan işlemi olarak yürütülebilen komut dosyasındaki komutların ekranda hiçbir şey göstermediğinden emin olmanız gerekir. Bunu yapmak için çıktıyı /dev/null konumuna yönlendirebilirsiniz. "Kara delik" gibi bir şey.

    Örneğin, hata mesajlarını şu şekilde bastırabilirsiniz:

    ls -al kötü dosya başka bir dosya 2> /dev/null
    Örneğin, bir dosyayı silmeden silmek istediğinizde aynı yaklaşım kullanılır:

    Cat /dev/null > dosyam

    Sonuçlar

    Bugün girdi ve çıktının komut satırı betiklerinde nasıl çalıştığını öğrendiniz. Artık dosya tanımlayıcıları nasıl kullanacağınızı, onları nasıl oluşturacağınızı, görüntüleyeceğinizi ve kapatacağınızı biliyorsunuz; girdi, çıktı ve hata yeniden yönlendirme hakkında bilgi sahibisiniz. Tüm bunlar, bash betiklerinin geliştirilmesinde çok önemlidir.

    Bir dahaki sefere Linux sinyallerinden, bunların betiklerde nasıl ele alınacağından, işleri bir programa göre çalıştırmaktan ve arka plan görevlerinden bahsedeceğiz.

    Sevgili okuyucular! Bu materyalde girdi, çıktı ve hata akışlarıyla çalışmanın temelleri verilmektedir. Eminiz ki aranızda tüm bunları ancak deneyimle anlatabilecek profesyoneller vardır. Eğer öyleyse sözü size bırakıyoruz.