Gli script Bash non verranno eseguiti senza digitare "bash" di fronte


11

Sul nostro sistema scolastico, siamo in grado di eseguire file di script senza digitare basho csho cosa hai senza indicare di che tipo di script si tratta. Su Ubuntu, tuttavia, devo digitare bash script.bashper esempio. È sempre necessario in Ubuntu o è un'impostazione che posso modificare?


1
è impostato come file eseguibile?
jsolarski,

Sì, il file è eseguibile, motivo per cui penserei che sarebbe solo eseguito da solo.
muttley91,

1
Quale errore viene visualizzato quando si digita ./script? Sei sicuro che lo script non sia stato modificato da un editor di Windows inserendo un carattere aggiuntivo alla fine delle righe? Ciò interromperebbe la prima riga indicando che lo script deve essere eseguito con bash.
João Pinto,

1
Come si avvia e qual è l'errore?
utente sconosciuto

+1 per non usare .shper gli script bash. In genere, tuttavia, le estensioni dei file non vengono utilizzate per gli script eseguibili nel mondo UNIX.
nyuszika7h

Risposte:


17
  1. Assicurati di avviare lo script con ./scripto percorso completo o altro. Basta scriptpotrebbe non funzionare (funziona se la directory è $PATH, come /usr/bin), dal momento che sui sistemi UNIX non è l'abitudine di avere la directory corrente nel percorso (per motivi di sicurezza, ed è buono!)

  2. Assicurati che lo script sia eseguibile, ad esempio: lo chmod +x scriptrenderà eseguibile.

  3. Assicurati di avere #!/bin/bashcome prima riga la tua sceneggiatura. Inoltre, assicurati che non venga modificato con un qualche tipo di editor di Windows, poiché spesso usa il "tipo DOS" di eol (fine riga) che differisce da quello UNIX (se l'elenco di controllo sopra è OK, ma sei diventato "cattivo" interprete: nessun tale file o directory "o giù di lì, anche se è / bin / bash, questo è spesso il motivo, in quanto non stampabile - quindi di solito non lo vedi - verrà trattato come la parte del percorso dell'interprete)

Altri già menzionati: è importante avere /bin/bashse si utilizzano le funzionalità di bash, anche con /bin/shlink simbolico /bin/bash, ma ora (per quanto ho notato) è collegato a symlink a dashcui non fornirà compatibilità bash, solo POSIX sh. È abbastanza importante, anche i software piuttosto costosi della nostra azienda hanno questo problema: gli script contengono #!/bin/shcome prima riga ma dipende anche dalle funzionalità di bash.


Quindi dovrò eseguirlo in questo modo: ./script, come ho scoperto. È meglio che dover scrivere "bash" ogni volta, e ha senso. Credo di averlo saputo prima, mi è passato di mente. Oh bene, grazie!
muttley91,

In teoria puoi mettere l'attuale directory di lavoro nella variabile PATH in modo da poter usare solo "script" invece di "./script" ma ti avverto: questa non è un'abitudine sui sistemi UNIX e può essere un problema di sicurezza ! Inoltre, non è bello in una scuola imparare le cose in un modo che non è mai stato la soluzione sui sistemi UNIX, quindi eviterei questa soluzione ...
LGB,

1
O, preferibilmente, #!/usr/bin/env bashche è leggermente più portatile.
Sparhawk,

4

Assicurarsi che la prima riga del file sia:

#!/bin/bash

Se lo shebang è #!/bin/sh, non dovresti usare alcuna funzionalità specifica per bash, ma solo funzionalità POSIX. Anche se /bin/shè un collegamento simbolico a bash, bash verrà eseguito in una modalità di compatibilità POSIX quando eseguito come sh, disabilitando alcune (ma non tutte) le funzionalità bash.

Dovrai anche assicurarti che lo script sia eseguibile, ovviamente.


No, l'ho impostato per colpire solo per abitudine comunque.
muttley91,

0

Un modo alternativo e fortemente scoraggiato si sta aggiungendo .a PATH.

PATH=".:$PATH"

o

PATH="$PATH:."

Il problema con questo approccio è che nel primo caso, qualsiasi comando di sistema poteva essere sovrascritto con eseguibili dalla directory corrente e, in quest'ultimo caso, i comandi sconosciuti potevano ancora essere sovrascritti.

Considera quanto segue:

File: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Molto probabilmente non lo noteresti fino a quando non è troppo tardi.


1
La scelta delle parole è leggermente fuorviante qui. I comandi non verranno ignorati. Se hai un comando nella directory di lavoro corrente che ha lo stesso nome di quello che vive nelle directory di sistema, echoad esempio, quello nella tua directory verrà usato semplicemente perché quella directory è impostata in PATHvariabile prima di /bin. Shell cerca semplicemente i comandi in determinate directory in base al loro ordine PATHe non sovrascrive / distrugge nulla. Ma sì, questo ha implicazioni
Sergiy Kolodyazhnyy il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.