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 

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


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

Не совладал с терминологией.

#!/bin/sh

curl="$(which curl)" || {
   echo "cURL not find. Aborting...";
   exit 1
}
$curl --insecure --negotiate ... 
anonymous
()
Ответ на: комментарий от anonymous

Дык, мне результат в переменную не нужен).

Я думал стоит ли каждую не core-utils определять с помощью which и обращаться к ней из переменной.

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

Я думал стоит ли каждую не core-utils определять с помощью which и обращаться к ней из переменной.

Э-э-э. Кстати это оверхэд, а я него повёлся. Тебе ж нужно только проверить наличие тулзы и в случае отсутствия застопить. Ты прав, всё гораздо проще:

#!/bin/sh

curl="$(which curl)" || {
   echo "cURL not find. Aborting...";
   exit 1
}
curl --insecure --negotiate ... 

Всё остальное - велосипеды с квадратными колёсами.

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

Понял, принял.

Только различай: $curl - это текст «/usr/bin/curl», а curl - это команда, такая же как cd,ls,…

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

текст разве не интерпретируется в команду?

Нет. Я показал тебе (с третьей попытки), как выполнить текст, но это - оверхэд.

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

Я думал стоит ли каждую не core-utils определять с помощью which и обращаться к ней из переменной.

Если вы только про получение полного пути, то смысла ровно ноль, which ищет по путям прописанным в PATH.

CURL="$(which curl)"
$CURL --insecure --negotiate ... 
ничем не будет отличаться от
curl --insecure --negotiate ...

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

И попробуйте возразить, что это не верно.

Даже пробовать не буду. Текст то один и тот же. Только в одном случае он выполнится, а в другом просто выведется.

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

И попробуйте возразить, что это не верно.

Стоять-бояться! Это у меня shell заглючил. Ну и пурги я наполол.

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

Да ладно? А мужики-то не вкурсе. Десятки тысяч скриптов написаны с использованием переменных, и работают. Но только у анона это не работает.

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

только у анона это не работает.

Надо, что ли, правило где-нибудь прибить: При тесте скриптов/строчников запускать эмулятор по новой.

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

Чуть поправлюсь, which имеет смысл в том случае если переменная в дальнейшем используется при запуске в другом окружении, например всякие su - username и так далее. Но это настолько редко, что нет особого смысла упоминать.
Вот для проверки существования, как писал анон выше, вполне подходит. Если это необходимо конечно.

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

Ещё забыл, а вот это что за фигня?

16 if [[ "$HOME" != '/var/root' ]]; then
 17   echo -e "\nFor correctly works \033[1;31mneed ROOT rights\033[0m\n";

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

И всё же повторюсь. Для твоих нужд bash ненужен. Ты ни одного башизма не пользуешь. Так пусть это будет выполняться и в sh, а значит и в других shell-ах. Ведь всегда есть какая-то ссылка /bin/sh.

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

Ну дык, тут только первые рядков n-надцать из n-сот.
Там далее есть массивы и прочее, прочее.

Скорее всего костили с велосипедами, но увы и ах. Как уж смог. :/

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

тут только первые рядков n-надцать из n-сот.

Хмм. MacOS говоришь. А вот эта штука: https://github.com/dvorka/hstr у Вас пашет? Я как на неё подсел, так от скриптов вообще отказался, держу в favorites коллекцию однострочников и в ус не дую.

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

у него $HOME где-то пользуется.

Если это так, то надо было ещё «подхимичить» что-то, поэтому и задал вопрос.

anc ★★★★★
()
Ответ на: комментарий от anc
xx-yy-001:Desktop admin$ id -u -r
501
xx-yy-001:Desktop admin$ sudo !!
sudo id -u -r
Password:
0
xx-yy-001:Desktop admin$ echo $HOME
/Users/admin
xx-yy-001:Desktop admin$ sudo echo $HOME
/Users/admin
xx-yy-001:Desktop admin$ sudo su
sh-3.2# echo $HOME
/var/root
sh-3.2# 
i3wm
() автор топика
Последнее исправление: i3wm (всего исправлений: 1)
Ответ на: комментарий от i3wm

Права root нужны для

Так почему не пользовать id, /var/root/certs занести в какую-нибудь переменную вначале скрипта и пользовать её вместо $HOME?

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

sudo echo $HOME

В данном случае вы получаете переменную $HOME вашего текущего пользователя.

anc$ sudo -i /bin/bash -c 'echo $HOME'
/var/root

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

Вот-вот. ТС обратите внимание имхо анон полностью прав.

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

можно и /bin/sh

Это ж считай приевшаяся самодостаточная конструкция:

sudo sh -c "что-то там..."

Зачем её менять?

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

1. Без -i не сработает
2. sh - это далеко не всегда sh, все зависит от дистров, чаще это линки на всякие dash/bash и так далее
3. Полные пути никогда не бывают лишними

anc ★★★★★
()
Ответ на: комментарий от anonymous
Because they are both different shells. sh on ubuntu is the dash shell, 
sh on minix is the ash shell, 
sh on slackware is the bash shell. 
And since not too long is sh on OSX also the bash shell

Начиная с Catalina - возможно zsh

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

Кстати. А где /bin/sh не линк? Ни разу не встречал.

mac os :) В рамках топика, удивительно не правда ли? :)

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

zsh

Много «вкусного» читал, но пересаживаться не стал. Но он же те же переменные пользует? $HOME, $USER, …?

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

Я вот пока тоже не юзал особо, но по идее должен те же.

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

And since not too long is sh on OSX also the bash shell

Однако

anc$ ls -lai /bin/{bash,sh}
8590656345 -r-xr-xr-x  1 root  wheel  618448 Oct 25  2017 /bin/bash
8590656423 -r-xr-xr-x  1 root  wheel  618512 Oct 25  2017 /bin/sh

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

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

Эт я нагулил, а от мака уже отошел к сожалению.

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