Možnosti bash a interaktivní skořápky

Zdá se, že volba -s pro bash opravdu nedělá nic

Když provádím příkazy s nebo bez toho se nic nezmění. Co mě opravdu mátlo, je to, že když spustím shell skript, vždy se mi zdá, že dostávám interaktivní shell. Předpokládám, že je to interaktivní, protože když použiji vestavěné čtení ve skriptu, vždy mě vyzve k vstup. Je to interaktivní?

Spustí se shell skript jako interaktivní ve Fedoře a existují nějaké příklady rozdílů, které mohou -s udělat? Přečetl jsem si manuálové stránky, ale nemohu Zdá se, že sám generuje nějaké příklady, které by měly nějaký účinek. Kombinoval jsem tyto dvě otázky, protože jsem se snažil použít s ke změně způsobu, jakým skript přijal vstup, a v některých cvičeních říkají, že to má účinek. Uvědomuji si, že může nastavovat argumenty, co nezískám, je, jak to změní na čtení ze standardního vstupu, vždy to vypadá, že to stejně dělá

Zde je to, co jsem použil k testování

if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY 

Číst vždy dokázalo pracovat v neinteraktivních i interaktivních skořápkách.

I když jsem testoval přítomnost fd / 0 a fd / 1 v neinteraktivní skořápky stále existovaly

Předem děkuji

Odpovědět

Bash také určí, zda nebo ne to je interaktivní zkoumáním, zda jsou jeho vstupy / výstupy připojeny k terminálu.

Neaktivní přepínač -s umožňuje bash skriptu zpracovat poziční parametry, když čtení příkazů ze souboru. např .:

$ cat demo.sh echo "$0 = " $0 echo "$1 = " $1 echo "$2 = " $2 $ bash < demo.sh foo bar bash: foo: No such file or directory $ bash -s < demo.sh foo bar $0 = bash $1 = foo $2 = bar 

Odpověď

The -s volba způsobí, že bash bude číst příkazy ze svého standardního vstupu. Bez této možnosti bude bash považovat svůj první argument za název skriptu, který má být proveden. možnost, bash považuje všechny své argumenty za argumenty skriptu, který načte při standardním vstupu. Možnost -s určuje pouze to, jak bash interpretuje své argumenty příkazového řádku, nikoli zda je instance prostředí interaktivní.

Instance bash je vždy interaktivní, pokud je spuštěna s možností -i. Bez -i je interaktivní pouze v případě, že není předán žádný název skriptu (-s to ovlivňuje) a ke kterému je připojen standardní vstup i standardní chyba terminál.

Testování PS1 vám neřekne, zda je instance prostředí interaktivní.¹ Můžete deaktivovat PS1 v interaktivním prostředí. Naopak neinteraktivní prostředí často dědí PS1 ze svého prostředí. Spolehlivým způsobem, jak otestovat, zda je prostředí spuštěno interaktivně, je otestovat, zda $- obsahuje i.

The read integrovaná díla z libovolného prostředí, interaktivního i jiného. Čte z čehokoli, co je připojeno ke standardnímu vstupu shellu (pokud není přesměrováno). Pokud se pokusíte číst ze stejného deskriptoru souboru, kde bash čte skript, který spouští, nakonec ve skriptu přeskočíte řádek (ne nutně na místě, které jste zamýšleli); například pokud předáváte skript na standardní vstup bash a chcete číst řádek z terminálu, musíte přesměrovat read call: read line </dev/tty.

Deskriptory souborů 0, 1 a 2 vždy existují (pokud nebyly uzavřeny); jsou to standardní vstup, standardní výstup a standardní chyba. To, zda je shell interaktivní nebo ne, nesouvisí s tím, na co ukazují standardní deskriptory, kromě toho, že zda fd 0 a 2 jsou terminály, ovlivňuje interaktivní stav prostředí.

¹ Ano, já s vědomím, že existují webové stránky, které to tvrdí. Mýlí se.

Odpovědět

Trochu více informací o interaktivních skořápkách:

To, zda je shell interaktivní, zjistíte zaškrtnutím $-. Pokud $- obsahuje i, pak je prostředí interaktivní.

Prostředí je interaktivní, když čte vstup přímo od uživatele. Neinteraktivní prostředí čte příkazy ze souboru řádek po řádku a provádí je. nedělá prostředí interaktivním, když čte cokoli ze stdin zevnitř skriptu, protože „skript čte vstup, ne shell“ (nevím, jak to lépe vysvětlit).

 labdebian# cat ./test #!/bin/bash echo Hello World echo $- read; echo $REPLY echo $- labdebian# bash test Hello World hB I"m typing this I"m typing this hB labdebian# bash -i test Hello World himB I"m typing this I"m typing this himB 

Komentáře

  • Co je matoucí, je v dokumentaci k bash. Říká se, že bude viset, pokud použijete čtení v non – interaktivní prostředí

odpověď

-s nevytváří shell interaktivní. Místo toho použijte -i.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *