Ответы пользователя по тегу bash
  • Что означает ошибка, выводящаяся при выполнении bash-скрипта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    выводится ошибка - [: missing `]'
    Что значит эта ошибка

    Эта ошибка означает, что
    1) bash разбил команду
    if [ "$projectDir" == "video" && "$flag" != "noflag" ]; then
    следующим образом: ключевое слово if, команда [ с аргументами "$projectDir" == "video", оператор &&, команда "$flag" с аргументами != "noflag" ], разделитель ;, оператор then.
    2) первая команда [ (она же test), очевидно, не нашла в своих аргументах закрывающей скобки ], которая должна там быть при таком её вызове.

    как ее можно исправить?

    использовать -a вместо &&, как говорит man test.
    Ответ написан
    Комментировать
  • Как заменить вывод текущей скорости консольной speedtest или подобной на построчный (LF - CRLF)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если записать вывод данных в файл
    # /opt/speedtest/speedtest | tee spdt.log
    то в файле не видно промежуточных значений значений.

    Дело в том, что консольная программа может определить, направлен ли её вывод в терминал или в файл, и вести себя по разному, в зависимости от этого. Понаблюдать, что и как именно программа выводит можно запустив её под strace, например так:
    strace -f -e ioctl,write -o log <program command line>

    Соответственно, поймать что такая программа выводит в процессе можно только предоставив ей в качестве вывода эмуляцию терминала.
    Ответ написан
    1 комментарий
  • Почему неправильно считается количество строк глобами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    myvar=$(find "/tmp/folders" -iname "App *" -type d -maxdepth 1)
    count=${#myvar[@]}
    echo $count


    И в ответ получаю число 120, которое означает количество символов, а не строк

    И это верно.

    2. Почему в моем примере выводится количество символов в переменной, а не количество строк?

    Потому что ${#myvar[@]} -- это длина массива. Если идея была создать в первой строке массив из имён файлов, то там не хватает пары скобок:
    myvar=( $(find "/tmp/folders" -iname "App *" -type d -maxdepth 1) )

    С таким определением myvar становится массивом а ${#myvar[@]} выведет длину этого массива, т.е. количество строк в нём.
    spoiler
    Имена файлов с пробелами, кстати, эту стройную картину малость испортят.
    С вашим определением выводится длинна массива, но в качестве массива выступает одна строка, так что это длина строки в символах.

    1. Реально ли подсчитать количество строк в файле или переменной с помощью глобов, как показано тут - https://stackoverflow.com/a/32727260 ?

    Да. Но использование для этой цели массивов оболочки выглядит странно и расточительно. В shell канонично считать строки командой wc -l.
    Ответ написан
    1 комментарий
  • Как не запрашивать логин / пароль Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как это исправить?

    добавить -f в опции login:
    login -f test

    Но вообще, пользоваться командой login для этого странно, когда есть su.
    Ответ написан
    Комментировать
  • Как проверить установленные права на /etc/shadow?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если права на файл не go-rwx

    разрешения на файл не могут быть go-rwx, эта запись означает "отнять rwx у g и o". Разрешения могут быть u=rw,go=. Получить их можно например так: stat -c %A /etc/shadow, а проверить условие -- командой test, например: if [ `stat -c %A /etc/shadow` != "-rw-------" ], или командой grep, например:
    if ! stat -c %A /etc/shadow | grep -q '^....------$'
    .

    Кроме того, можно не париться и просто всегда делать chmod go-rwx /etc/shadow.
    Ответ написан
    Комментировать
  • Ошибка в bash скрипте: bash unexpected EOF while looking for matching `'' - что именно не так?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    На вид всё выглядит корректно, все кавычки парные и вовремя закрыты.
    domains="$(cat /opt/cloudfave/cluster_config.js | grep domain | awk '/domain: / { print $2 }' | sed -e \"s/[,']//g\")"

    вот здесь одиночная кавычка в строке sed портит разбор
    Ответ написан
    4 комментария
  • Как подставить в echo переменную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как я могу данные из них подставить в echo, сохранив при этом функционал запроса?

    eval "echo {$A1}.{$A2}.{$A3}"
    Потому что расширение таких конструкций со скобками -- функция shell, поэтому они должны буквально в таком виде попасть в shell. eval применяет функциональность shell к произвольной строке.
    Ответ написан
    3 комментария
  • Как записать информацию из вывода в файл с неизвестным названием?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как перенаправить информацию из вывода команд в файл, который создается в процессе проверки командой
    #touch $( date '+%Y-%m-%d_%H-%M' )

    Записать имя файла в переменную и дальше везде использовать её. Например:
    …
    file=$( date '+%Y-%m-%d_%H-%M' )
    touch "$file"
    …
    echo -e "               Product Name : $PN_FRU" >> "$file"
    …
    Ответ написан
    Комментировать
  • Как правильно подменить (скопировать) скрипта в самом скрипте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли способ из самого скрипта подменить сам скрипт чтобы он не портился?

    Когда cp или mv заменяет открытый интерпретатором файл, исходный файл не портится. Если интерпретатор взаимодействует с файлом через один и тот же файловый дескриптор, то никакого значения замена файла не имеет. Нужно разбираться с деталями того что портится, чтобы понять, как это пофиксить.
    Ответ написан
    Комментировать
  • Почему файл не выполняется под пользователем user1?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Биты setuid/setgid не работают со скриптами. Они работают только с двоичными исполняемыми файлами. Скрипт -- это текстовый файл интерпретируемый другой программой. Чтобы выполнить скрипт под другим пользователем воспользуйтесь командой sudo.
    Ответ написан
    Комментировать
  • Как в bash через sed заменить строку через регулярное выражение?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    lang="[a-zA-z]{2}"
    диапазон из 2-х любых латинских букв

    Должно быть lang="[a-zA-Z]\{2\}"
    Ответ написан
    Комментировать
  • Как добавить к тексту слово, после последнего совпадения через sed?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Необходимо добавить после ips_addr_1 слово ips_addr_2, нужно чтобы было совпадение по последнему слову

    sed 's/\(.*ips_addr_[0-9]\)/\1 ips_addr_2/'
    Ответ написан
    Комментировать
  • Почему не отрабатывает exit на третьем уровне скрипта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Написали многоуровневое меню при помощи функций, работает без проблем все, кроме выхода.
    Примерно на 2-3 уровне меню "Exit" не выходит из скрипта, а возвращается на уровень выше.

    всё зависит от того, как эти функции вызываются. Если так:

    clear; ./1_1_ipmi_menu.sh ; unem ;;

    то разумеется вызов exit внутри скрипта 1_1_ipmi_menu.sh приведёт в возврату в unem, вы же тут отдельный процесс создаёте.
    Чтобы exit в функциях приводил к выходу из приложения нужно импортировать (source) функции из этих скриптов и вызывать функции вместо запуска скриптов.
    Типа того:
    #!/bin/bash
    unem() {
            read b
            case $b in
              1) clear ; … ; unem ;;
              2) clear; PMI ; unem ;;
              3) clear ; menu ;;
              0) exit 0 ;;
            esac
    }
    source 1_1_ipmi_menu.sh
    source 1_1_system_menu.sh
    unem
    Ответ написан
    Комментировать
  • Как создать такой вывод в bash script?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    С чего начинать разбираться?

    man 7 inode -- обзор того, какие атрибуты есть у файлов
    man 1 mkdir -- создавать каталоги и назначать им разрешения
    man 1 touch -- создавать файлы и менять даты файлам и каталогам
    man 1 chmod -- менять разрешения файлам и каталогам
    man 1 ln -- создавать символьные ссылки
    Ответ написан
    7 комментариев
  • Как правильно в bash скрипте использовать $?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    дамп postgres, после чего, если комманда с дампом выполнилась…
    pg_dump -U postgres zkgu | gzip > /mnt/NStore/1c-sqldump/$n$d.gz
    EXIT_STATUS=$?
    if [[$EXIT_STATUS -eq "0"]]

    Вместо двух лишних действий с текстовым представлением то же самое можно сделать идиоматично:
    if pg_dump -U postgres zkgu | gzip > /mnt/NStore/1c-sqldump/$n$d.gz


    Но есть одно "но": написанная вами команда делает не то, что вы хотели: $? -- это статус завершения последней команды, а у вас там пайплайн и последняя команда -- gzip. Статус завершения именно pg_dump не проверяется, ни первым вариантом, ни вторым.
    Ответ написан
    Комментировать
  • Как разархивировать архив tar.gz, в котором архив и т.д?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Studencheskaya32 --to-command -- это прикольно.
    Но мне больше нравится решение с -O:
    tar -xzvOf archive.tar.gz | tar -xzvO | tar -xzvO | … | tar -xzvO | tar -xzv
    Ответ написан
    Комментировать
  • Как удалить все строки до n через sed?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как отредактировать это, чтобы работало?
    получаю n через grep
    Далее пытаюсь понять как удалить через sed все строки от 1 до n

    Можно всё это выполнить в одном скрипте sed:
    sed -i '0,/string:/d' file1
    Ответ написан
    2 комментария
  • Как осуществить преобразование вывода в переменную с вычитанием установленного числа в одну строчку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как осуществить

    Подставить одно в другое:
    maxiter=$(( $(cat $1 | wc -l) - 1 ))
    Ответ написан
    Комментировать
  • Как сравнить вывод скрипта с файлом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как все-таки правильно сверить, должно быть 100 процентное совпадение с эталонным файлом в результате команды должна быть 1.

    ./test.sh | if cmp -s - test ; then echo 1 ; else echo 0 ; fi


    result=$(./test.sh)| cmp -s $result test

    это почти попытка сравнить текст выводимый test.sh с содержимым файла test, но здесь не нужен конвейер и cmp так не работает.

    cmp -s (./test.sh) test

    Это почти рабочий вариант для bash, полностью рабочий выглядит так: cmp -s <( ./test.sh ) test. Но из-за того, что конструкция <(…) специфична для bash этот вариант на мой взгляд менее предпочтителен чем вариант ./test.sh | if cmp -s - test.
    Ответ написан
    Комментировать
  • Почему не заменяет перенос строки на пробел?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    sed -e '/\n\/\s/g'
    Но почему ентер не меняется на пробел.

    Что тут вообще написано? Судя по g в конце имелось в виду 's/\n/ /g'?
    Не работает потому что sed читает ввод построчно и конец строки как символ обычно не попадает в паттерн спейс. Но есть команда N которая добавляет \n и следующую строку к уже прочитанной: speedtest --simple | sed '1d;N;s/\n/ /g'
    Ответ написан
    4 комментария