Почему bash shebang работает, а sh shebang — нет, для замены строки

awk -F"[<>]" '/longitude/{long=$3}/latitude/{print $3","long}' file.txt
5
16.06.2021, 12:32
2 ответа
Ожидается, что

/bin/shбудет только оболочкой POSIX, а оболочка POSIX не знает о подстроках в расширениях параметров .

POSIX «определяет стандартный интерфейс и среду операционной системы, включая интерпретатор команд (или «оболочку» )», и является стандартом, которому в основном следуют в традиционных средах стиля Unix -.См. Что такое POSIX? для более подробного описания. В средах, вдохновленных POSIX -, /bin/shдолжен предоставлять оболочку в стиле POSIX -, а в сценарии, использующем /bin/shв качестве своего шебанга, вы можете полагаться только на функции POSIX (, хотя большинство реальных реализаций из /bin/shпредоставить больше ). Совершенно нормально полагаться на более продвинутую оболочку, но shebang необходимо соответствующим образом скорректировать.

Поскольку ваш скрипт использует функцию bash, правильным шебангом будет#!/bin/bash(или, возможно, #!/usr/bin/env bash), независимо от среды, в которой он будет работать. В некоторых случаях он может работать с #!/bin/sh, но это просто счастливый случай.

25
28.07.2021, 11:24

Ваш скрипт использует не -POSIX-расширение для расширения параметров, поэтому он не будет работать в большинстве оболочек.

Это может быть решено либо путем принудительного выполнения сценария такой оболочкой, как bash, либо написанием сценария оболочки POSIX , что во многих случаях является хорошей привычкой.

К сожалению, нет элегантного способа получить первый символ в параметре, как в zshс помощью $1[1]. Таким образом, можно использовать

  • "$(echo "$1" | cut -c1-1)"или
  • "$(printf %.1s "$1")"или
  • странный "${1%"${1#?}"}", который удаляет строку без первого символа(${1#?})из строки
8
28.07.2021, 11:24

Теги

Похожие вопросы