Mam skrypt bash, który ma wiele echo
instrukcji, a także alias echo
do echo -e
obu w .bash_profile
i .bashrc
, dzięki czemu nowe wiersze są drukowane poprawnie dla instrukcji takich jak echo 'Hello\nWorld'
wynik powinien być
Hello
World
ale otrzymuję wynik
Hello\nWorld
Próbowałem nawet użyć shopt -s expand_aliases
w skrypcie, to nie pomaga
Uruchamiam skrypt jako bash /scripts/scriptnm.sh
; jeśli uruchomię go, gdy . /scripts/scriptnm.sh
otrzymuję pożądaną wydajność ...
echo
jak chcesz, to zła praktyka IMHOOdpowiedzi:
Mieszana historia
echo
oznacza, że jej domyślne działanie różni się w zależności od powłoki. POSIX określa, że wynikiemecho
jest „zdefiniowany w implementacji”, jeśli pierwszym argumentem jest-n
lub dowolny argument zawiera odwrotny ukośnik.Bardziej niezawodne jest użycie
printf
(jako polecenia wbudowanego lub polecenia zewnętrznego), gdzie zachowanie jest lepiej zdefiniowane: znaki odwrotnego ukośnika w stylu C i specyfikatory formatu są obsługiwane w ciągu formatu (pierwszy argument).Można kontrolować ekspansję BACKSLASH sekwencje z bash „s
echo
wbudowane polecenie zxpg_echo
opcją powłoki.Ustaw go u góry dowolnego skryptu bash, aby
echo
automatycznie rozszerzać sekwencje specjalne odwrotnego ukośnika bez konieczności dodawania-e
do każdego polecenia echa.źródło
Gdy używasz
bash myfile.sh
, Bash jest uruchamiany w trybie „wsadowym”, w osobnym procesie i nie odczytuje swojego profilu ani pliku rc.Kiedy używasz
. myfile.sh
, plik jest pobierany przez bieżący proces powłoki (tak jakby jego zawartość została przez Ciebie wpisana), dlatego widzi twoje aktualnie zdefiniowane aliasy.Zasadniczo pisanie skryptów zależnych od konkretnej konfiguracji powłoki, zwłaszcza aliasów, jest bardzo złym pomysłem , chyba że zdefiniujesz je w samym skrypcie . ( Nigdy nie polegaj na użytkowniku
.bashrc
, nawet jeśli jest on Twój).źródło
Zalecaną praktyką jest stosowanie
printf
wszystkich nowych skryptów.źródło
Działa to dobrze w terminalu
zapisz do pliku i uczyń go wykonalnym (chmod + x)
uruchom jako ./twoj_plik
źródło