LINUX.ORG.RU
ФорумAdmin

bash.sh

 ,


0

1

Трям! Здравствуйте!

Прошу Вашего совета в банальном, казалось бы, вопросе, а именно: начало скрипта на Bash.
На данный момент скрипты начинаю так.

  1 #! /usr/bin/env bash
  2 
  3 if test "$BASH" == "" || "$BASH" -uc "a=();true \"\${a[@]}\"" 2>/dev/null; then
  4   #BASH 4.4 version
  5   set -uo pipefail
  6 else
  7   #BASH 4.3 and older version
  8   set -o pipefail
  9 fi
 10 shopt -s nullglob
 11 
 12 printf "\033c"
 13 
 14 ######################################## REQUIRMENTS ########################################
 15 
 16 if [[ "$HOME" != '/var/root' ]]; then
 17   echo -e "\nFor correctly works \033[1;31mneed ROOT rights\033[0m\n";
 18   exit 1
 19 fi
 20 
 21 ######################################### VARIABLES #########################################
 22 

Вопрос: стоит ли прописывать каждую утилиту в REQUIRMENTS? Пример.

  1 #!/usr/bin/env bash
  2 
  3 curl="$(which curl)" || {
  4   echo "cURL not find. Aborting...";
  5   exit 1
  6 }
  7 
  8 $curl --insecure --negotiate ...
  9 

Можете дать линку на хороший, по Вашему мнению, скрипт у какого можно подсмотреть технику написания?


Ответ на: комментарий от anc

различаются как минимум по размеру

Тебя хакнул ты сам:

$ ls -lai /bin/{bash,sh}
1304710 -rwxr-xr-x 1 root root 941252 Окт 26  2016 /bin/bash
   1664 lrwxrwxrwx 1 root root      4 Мар  1  2012 /bin/sh -> dash
anonymous
()

bash.sh

Когда прочитал, подумал, что ты хочешь переписать bash на shell :)

ArkaDOSik ★★
()
Последнее исправление: ArkaDOSik (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тебя хакнул ты сам:

Речь шла про mac os, и мой пример оттуда. Не надо из контекста выдергивать плиз.

anc ★★★★★
()
Ответ на: комментарий от anonymous

Вот именно поэтому за /bin/sh «надо бить по наглой рыжей морде» (с) анекдот. Поведение в разных дистрах/версиях-дистра может быть не предсказуемым. Вам показалось, что написали /bin/sh и все робит, потом обновились, а там вовсе не bash а dash или zsh и так далее.

anc ★★★★★
()
Ответ на: комментарий от anc

а там вовсе не bash а dash или zsh и так далее.

Но если «действительно» соблёл sh, то пахать то будет на любом shell-е!

anonymous
()
Ответ на: комментарий от anonymous

1. Нет
2. Вы не поняли? Кто сказал, что при написании там был действительно sh ? А не bash например?

anc ★★★★★
()
Ответ на: комментарий от anc

Кто сказал, что при написании там был действительно sh

335… Никто ничего такого не говорил! Я говорю, что запилив скрипт СПЕЦИАЛЬНО под sh, ты получишь годноту под любой shell!

anonymous
()
Ответ на: комментарий от i3wm

устарел морально и был заменен

Устарел - да. Заменён - вот тут всё сложнее, так как есть zsh, fish и прочие прелести.

anonymous
()
Ответ на: комментарий от anonymous

Я говорю, что запилив скрипт СПЕЦИАЛЬНО под sh, ты получишь годноту под любой shell!

гарантирует совместимость?

Не того спросил. Точно не того. Здесь я спасую.

Ну вы уж определитесь.

anc ★★★★★
()
Ответ на: комментарий от anc

Ну вы уж определитесь.

Не могу. У меня диссонанс. И, вообще, ТС тебя должен был спросить. А то как «кота в мешке», так сразу мне.

anonymous
()
Ответ на: комментарий от anc

тому и отвечать. Разве нет?

Круто. Но у меня диссонанс, бред опять начался, так что отвечать тебе придётся.

anonymous
()
Ответ на: комментарий от anonymous

бред опять начался

Ничего страшного. Праздники... всё нормально, бывает :) Ваш бред не самый страшный :)

anc ★★★★★
()
Ответ на: комментарий от anc

Ваш бред не самый страшный

В качестве бреда: если все скрипты initv написаны под sh, а sh мож оказаться кем угодно, то правила написания этих скриптов должны удовлетворять всем shell-ам. Не?

anonymous
()

Я делаю в скриптах так:

REQS="curl awk sed"
for REQ in REQS
do
  "$REQ" --help 1>/dev/null 2>/dev/null
  if [ $? -eq 127 ]
  then
    echo "ERROR: $REQ is missing!"
    exit 1
  fi
done
anonymous
()
Ответ на: комментарий от anonymous

Не сходится. Положить систему, поменяв /bin/sh на другой shell?

Легко. Этому посвящено много матерных топиков.

ЗЫ
Не дописал, а вот вопрос ТС «соблюдение POSIX стандартов» в целом должен исполнить на любой системе. И то не факт, могут быть нюансы. Без тестов не поймешь.

anc ★★★★★
()
Ответ на: комментарий от anc

Легко.

Так это ж дерьмецо какое то. И кто до такого додумался?

«соблюдение POSIX стандартов» в целом должен исполнить на любой системе. И то не факт

Это твой «кот в мешке».

anonymous
()
Ответ на: комментарий от anc

2. sh - это далеко не всегда sh, все зависит от дистров, чаще это линки на всякие dash/bash и так далее

Но, справедливости ради и точности для, смысл ровно наоборот. Принято, что если вы юзаете sh, то это sh-like, а не, скажем, csh-like, который сильно по синтаксису отличается, как и всякие новомодные fish и т д. Потому линк sh на ash/dash/bash/zsh — законен и можно смело юзать минимальный набор sh-синтаксиса. Теперь можно сказать, что это именно в минимуме как раз ash-синтаксис.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 3)
Ответ на: комментарий от vodz

и можно смело юзать минимальный набор sh-синтаксиса.

Если только минимальный. sh менялся в разное время. Выше я ответил анону

«соблюдение POSIX стандартов» в целом должен исполнить на любой системе. И то не факт

Вот приписка «и то не факт» как раз относиться в вариативности. 99% что все будет верно. Но 1% все равно остается, надо проверять.

anc ★★★★★
()
Ответ на: комментарий от anc

Если только минимальный. sh менялся в разное время. Выше я ответил анону

Ох. Я понимаю, что данный тонкий момент тянет на полноценную статью, но всё же.

О том и речь, что если вы выставили в скрипте #!/bin/sh, то вы это и подразумеваете, что вам минимальный для этого скрипта достаточен. И 50 лет назад sh был вполне языком программирования, умевшем и переменные и if и циклы и read, который быстро устаканился до сегодняшнего posix-минимального, то есть и с ${var} и $(cmd) и case. Теперь это ещё и $((expri)) и ${var:#%} и {cmdlist;}. Беспокоиться о том, на какой sh-like поставлен линк в /bin/sh нет необходимости.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от Bootmen

Просто из vim’a скопировал)
Да и как по мне ориентироватся проще.

i3wm
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.