Na naszym systemie szkolnym, jesteśmy w stanie uruchomić plików skryptów bez pisania bash
lub csh
lub co ty bez wskazania, jaki rodzaj skryptu jest. Jednak w Ubuntu muszę bash script.bash
na przykład pisać . Czy jest to zawsze konieczne w Ubuntu, czy jest to jakieś ustawienie, które mogę zmienić?
11
.sh
skryptów bash. Zasadniczo jednak rozszerzenia plików nie są używane w skryptach wykonywalnych w świecie UNIX.Odpowiedzi:
Upewnij się, że zaczynasz skrypt od
./script
pełnej ścieżki lub cokolwiek innego. Po prostuscript
może nie działać (działa, jeśli katalog jest w$PATH
, jak/usr/bin
), ponieważ w systemach UNIX nie jest nawyk posiadania bieżącego katalogu na swojej ścieżce (ze względów bezpieczeństwa i jest dobry!)Upewnij się, że skrypt jest wykonywalny, na przykład:
chmod +x script
sprawi, że będzie on wykonywalny.Upewnij się, że masz
#!/bin/bash
jako pierwszy wiersz w skrypcie. Upewnij się również, że nie jest edytowany za pomocą jakiegoś edytora systemu Windows, ponieważ często używa on „typu DOS” eol (koniec linii), który różni się od UNIX (jeśli powyższa lista kontrolna jest OK, ale masz „zły” interpreter: nie ma takiego pliku lub katalogu ”, nawet jeśli jest to / bin / bash, jest to często powód, ponieważ nie można go wydrukować - więc zazwyczaj go nie widzisz - \ r będzie traktowany jako część ścieżka tłumacza)Inni już wspominali: ważne jest, aby
/bin/bash
używać funkcji bash, również/bin/sh
był dowiązany do/bin/bash
, ale teraz (o ile zauważyłem) teraz jest dowiązany do,dash
który nie zapewni kompatybilności bash, tylko POSIXsh
. Jest to dość ważne, nawet dość drogie oprogramowanie w naszej firmie ma ten problem: skrypty zawierają#!/bin/sh
jako pierwszą linię, ale zależy to również od funkcjonalności bash.źródło
#!/usr/bin/env bash
który jest nieco bardziej przenośny.Upewnij się, że pierwszy wiersz pliku brzmi:
Jeśli shebang jest
#!/bin/sh
, nie powinieneś używać żadnych funkcji specyficznych dla bash, tylko funkcje POSIX. Nawet jeśli/bin/sh
jest dowiązaniem symbolicznymbash
, bash będzie działał w trybie zgodności z POSIX, gdy będzie uruchomiony jako sh, wyłączając niektóre (ale nie wszystkie) funkcje bash.Oczywiście musisz także upewnić się, że skrypt jest wykonywalny.
źródło
Alternatywnym, zdecydowanie odradzanym sposobem jest dodawanie
.
doPATH
.lub
Problem z tym podejściem polega na tym, że w pierwszym przypadku dowolne polecenie systemowe można zastąpić plikami wykonywalnymi z bieżącego katalogu, a w drugim przypadku nieznane polecenia mogą zostać zastąpione.
Rozważ następujące:
Plik: ls
Najprawdopodobniej nawet tego nie zauważysz, dopóki nie będzie za późno.
źródło
echo
na przykład, że ta w twoim katalogu zostanie użyta po prostu dlatego, że ten katalog jest ustawiony wPATH
zmiennej przed/bin
. Shell po prostu szuka poleceń w poszczególnych katalogach w zależności od ich kolejnościPATH
i niczego nie zastępuje / nie niszczy. Ale tak, ma to implikacje