Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Obecná podpora => Téma založeno: Ventero 04 Června 2023, 14:01:13
-
Pokud spustím skript v terminálu, tak to hlásí, že příkaz nenalezen. Jak mohu ručně spustit skript via terminál?
Edit:
Tak via terminál jsem to zjistil - musím použít příkaz "sh" - nechápu, proč to nejde přímo - na co je pak ten příznak spustitelnosti ? ..
Jaký je rozdíl mezi #!/bin/sh a #!/bin/bash ?
-
Pokud spustím skrpt v terminálu, tak to hlásí, že příkaz nenalezen. Jak mohu ručně spustit skript via terminál?
Edit:
Tak via terminál jsem to zjistil - musím použít příkaz "sh" - nechápu, proč to nejde přímo - na co je pak ten příznak spustitelnosti ? ..
Jaký je rozdíl mezi #!/bin/sh a #!/bin/bash ?
Bash je "nadstavba" sh. Umí toho více. Což nic nemění na tom, že máš ten shebang určitě špatně. Copak ti vypíšewhich bash
which sh
Myslím že bys tam měl mít#! /usr/bin/sh
Ale dokonalost je#! /usr/bin/env sh
Je lepší (přenositelnější) používat sh, pokud tě neomezuje.
-
Shebang je v obou případech dobře - moderně je to takto - i which to tak vypsal.
Tak ono to nakonec funguje i bez toho "sh", ale musí člověk zadat kompletní cestu, bez ohledu na to, v jakém adresáři se nachází. Moc logiku mi to nedává, ale co ..
Tak a teď ještě, jak docílit toho, že to spustím rovnou jako root - aby mi to po dvojkliku nabídlo dialog se zadáním hesla (zde bolestně chybí to, jak je to ve Win - pravoklik/spustit jako správce/zadat heslo), pokud nechci dělat opičárnu s umístěním skriptu, sudoers a druhým skriptem, který bude ten první spouštět?
-
shebang musí obsahovat absolutní cestu k interpreteru! Jinak se to nespustí. Protože shebang říká systému co za
program skript se má spouštět. V unix systémech nezáleží na příponách souborů jako ve win, ale právě na takových drobnostech jako je shebang. Začíná křížkem jako komentář aby kdo to nezná (win) to ignoroval.
-
Tak interpreter bude ta utilita sh nebo bash a ty jsou v /bin - to tam jasne je.
To vypada na nejakou haluz terminalu nebo nejake ne moc smysluplne opatreni.
Z plochy soubor dvojklikem spustim.
Z terminalu pomoci "/home/mujadresar/Plocha/skript" spustim.
Z terminalu v umisteni Plocha (napr. pomoci cd) hlasi "Prikaz nenalezen"
To proste nedava logiku.
-
Tak interpreter bude ta utilita sh nebo bash a ty jsou v /bin - to tam jasne je.
To vypada na nejakou haluz terminalu nebo nejake ne moc smysluplne opatreni.
Z plochy soubor dvojklikem spustim.
Z terminalu pomoci "/home/mujadresar/Plocha/skript" spustim.
Z terminalu v umisteni Plocha (napr. pomoci cd) hlasi "Prikaz nenalezen"
To proste nedava logiku.
Protože skript nestoji v ceste PATH. Pak ho musíš spouštět buď pomocí absolutní adresy nebo relativní. Bylo to tak od nepaměti. Logika je v tom, že nemůžeš a ani někdo jiný podstrčit falešný skript. Dovedeš si představit co by nadělal skript s názvem echo, mount nebo poweroff co přišel poštou obsahující toto #! /usr/bin/env bash
rm -rf /
Jestli to odzkoušíš budeš mne proklínat na věky věků!
Další už zkoušej o 106
Proto tu máme PATH a spouštění
Pomocí absolutní adresy:/home/mujadresar/Plocha/skript
Pomocí relativní adresy:cd /home/mujadresar/Plocha/
pwd
./skript
cd ../
pwd
./Plocha/skript
A pokud máš /home/mujadresar/Plocha v PATH tak stačí jenskript
ať jsi kdekoliv.
Interpreter může být také python, ruby, lua, atd. Proto je nejlepší použít#! /usr/bin/env interpreter
Pak máš jistotu, že to poběží skoro všude.
Jinak jak jsem koukal, tak ubu18 má fakt sh i bash v /bin což je zastaralé! Moderně je to v /usr/bin Což je další důvod k používání #! /usr/bin/env interpreter kvůli přenositelnosti.
-
Tak a teď ještě, jak docílit toho, že to spustím rovnou jako root - aby mi to po dvojkliku nabídlo dialog se zadáním hesla (zde bolestně chybí to, jak je to ve Win - pravoklik/spustit jako správce/zadat heslo), pokud nechci dělat opičárnu s umístěním skriptu, sudoers a druhým skriptem, který bude ten první spouštět?
Tak to už záleží čistě jen na tvém DE (KDE, MATE, GNOME, ....) Každé to má trochu jinak a každé to má určitě nejlépe vyřešené ;D
-
Tak a teď ještě, jak docílit toho, že to spustím rovnou jako root - aby mi to po dvojkliku nabídlo dialog se zadáním hesla (zde bolestně chybí to, jak je to ve Win - pravoklik/spustit jako správce/zadat heslo), pokud nechci dělat opičárnu s umístěním skriptu, sudoers a druhým skriptem, který bude ten první spouštět?
Tak to už záleží čistě jen na tvém DE (KDE, MATE, GNOME, ....) Každé to má trochu jinak a každé to má určitě nejlépe vyřešené ;D
Trochu mě děsí to postupné vypreparování spouštět věci v DE jako root. Naposled když jsme to řešil v KDE, tak začlo KDE padat jen proto, že mělo na ploše zástupce s admin právy.
-
Jaký je rozdíl mezi #!/bin/sh a #!/bin/bash ?
sh může obsluhovat v každé linux. distribuci něco jiného.
-
Jaký je rozdíl mezi #!/bin/sh a #!/bin/bash ?
sh může obsluhovat v každé linux. distribuci něco jiného.
Jednoduše řečeno sh je jen definice standardu (POSIX). Je jich více implementací (dash, ksh, atd.) A ty musí ten standard bezpodmíněčně dodržovat. Každý si pak přidá něco malinko navíc. Bash musí ten standard také dodržovat, ale přidává hodně komfortu navíc. Skripty psané v bashi jsou přenositelné jen v bash. Kdežto psané ve standardu sh (není to moc jednoduché a kolikrát i "nemožné") by měli být přenositelné všude. sh se v některých systémech používá kvůli velikosti. Oproti bash je o řád a něco menší. Zkus si zadat do terminálufile -h /bin/sh
A zjistíš co ti implementuje sh standard. V debian světě je to dash, pokud jsi to cíleně nezměnil. A pak zadejwc -c /bin/sh
a uvidíš velikost. Pak zkuswc -c /bin/bash
a to je sakra rozdíl. Mimochodem v Alpine je sh link na busybox, v Archu na bash a ve Voidu mám za to že je ksh (laptop s tímto systémem dostal potomek tak momentálně nemůžu přesně určit). Alpine ani Void nemají bash v základu nainstalovaný! Teď mě došlo, že vlastně ani Ubuntu pokud se udělá minimální instalace přes debootstrap nemá bash. sh se hodí jen na skriptování! Pracovat s ním interaktivně je masochismus nejtvrdšího zrna. Můžeš odzkoušet tím že v terminálu zadáš sh
nebo dash
anebo bash --posix
. Vyskočit z toho jde klávesovou zkratkou ctrl+d
-
Podnětný příspěvek!
Poprvé když jsem se setkal s minimal Bashem/Busyboxem, jsem zadrhl. Jako bych neměl ruce. :-)
-
Jinak jak jsem koukal, tak ubu18 má fakt sh i bash v /bin což je zastaralé! Moderně je to v /usr/bin Což je další důvod k používání #! /usr/bin/env interpreter kvůli přenositelnosti.
Si jdu jen tak číst aby hlava odpočinula a hele na co jsem narazil: https://www.root.cz/clanky/kam-mizi-adresare-bin-sbin-a-lib-a-proc-uz-je-nepotrebujeme/