[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/debug-bash-script":3,"mdc--9hcpyf-key":669,"mdc-hnziq8-key":696,"mdc-icd0ws-key":704,"mdc--xahny7-key":720,"mdc--or9gpu-key":743,"mdc--ydqxyx-key":759,"mdc--xjtbfw-key":775,"mdc--6f23j3-key":791,"mdc-avvlbg-key":813,"mdc-2a7ylj-key":843,"related-/guides/linux/debugging-shell-scripts,/guides/linux/use-bash-trap,/errors/linux/bash-permission-denied":860},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":599,"code":104,"createdAt":600,"description":601,"difficulty":602,"draft":603,"estimatedTime":604,"extension":605,"faq":606,"howToSteps":619,"howToTotalTime":638,"image":599,"keywords":639,"locale":648,"meta":649,"navigation":161,"path":650,"platform":651,"related":652,"section":656,"seo":657,"severity":104,"stem":658,"summary":659,"tags":660,"twitterCreator":599,"twitterSite":599,"type":667,"updatedAt":600,"__hash__":668},"content_ru/guides/linux/debug-bash-script.md","Как отладить Bash-скрипт: пошаговое руководство по исправлению ошибок",[7,8,9,10],"Bash 5.x","Ubuntu 20.04/22.04","Debian 11","Fedora 36+","FixPedia Team",{"type":13,"value":14,"toc":586},"minimark",[15,20,24,28,78,85,88,92,98,123,130,134,145,185,188,192,199,228,245,249,256,329,335,345,351,387,390,401,421,425,428,443,460,464,467,479,486,509,516,520,579,582],[16,17,19],"h2",{"id":18},"введение-зачем-это-нужно","Введение / Зачем это нужно",[21,22,23],"p",{},"Работа с Bash-скриптами часто бывает быстрой, но когда что-то идёт не так, отладка может затянуться. В этой статье мы покажем, как использовать встроенные инструменты отладки Bash, чтобы быстро находить и устранять ошибки, не прибегая к сторонним IDE. После выполнения этих шагов вы сможете самостоятельно диагностировать проблемы, даже если скрипт сложный.",[16,25,27],{"id":26},"требования-подготовка","Требования / Подготовка",[29,30,31,39,50,64],"ul",{},[32,33,34,38],"li",{},[35,36,37],"strong",{},"Операционная система",": Linux (Ubuntu, Debian, Fedora и т.д.)",[32,40,41,44,45,49],{},[35,42,43],{},"Версия Bash",": 5.0 или выше (",[46,47,48],"code",{},"bash --version",")",[32,51,52,55,56,59,60,63],{},[35,53,54],{},"Инструменты",": текстовый редактор (например, ",[46,57,58],{},"vim",", ",[46,61,62],{},"nano","), терминал с правами доступа пользователя (sudo не требуется для простых скриптов)",[32,65,66,69,70,73,74,77],{},[35,67,68],{},"Необязательно",": отладчик ",[46,71,72],{},"bashdb"," (",[46,75,76],{},"sudo apt install bashdb"," на Debian/Ubuntu)",[21,79,80,81,84],{},"Все команды предоставлены для Bash по умолчанию. Если у вас старая версия, обновите систему с помощью ",[46,82,83],{},"sudo apt update && sudo apt upgrade",".",[86,87],"in-article-ad",{},[16,89,91],{"id":90},"шаг-1-запустить-скрипт-с-трассировкой","Шаг 1: Запустить скрипт с трассировкой",[21,93,94,95,84],{},"Самый быстрый способ увидеть, что происходит, — это запустить скрипт с ключом ",[46,96,97],{},"-x",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-bash shiki shiki-themes github-light github-dark","bash -x script.sh\n","bash","",[46,106,107],{"__ignoreMap":104},[108,109,112,115,119],"span",{"class":110,"line":111},"line",1,[108,113,103],{"class":114},"sScJk",[108,116,118],{"class":117},"sj4cs"," -x",[108,120,122],{"class":121},"sZZnC"," script.sh\n",[21,124,125,126,129],{},"Команда ",[46,127,128],{},"bash -x"," выводит каждую команду перед её выполнением, её параметры и текущее значение переменных. Это полезно для выявления ненужных веток или бесконечных циклов.",[16,131,133],{"id":132},"шаг-2-добавить-точку-останова-с-помощью-trap","Шаг 2: Добавить точку останова с помощью trap",[21,135,136,137,140,141,144],{},"Для более точной отладки можно использовать ",[46,138,139],{},"trap"," с действием ",[46,142,143],{},"DEBUG",". Это вызовет пользовательское сообщение перед каждой командой.",[99,146,148],{"className":101,"code":147,"language":103,"meta":104,"style":104},"#!/usr/bin/env bash\n\ntrap 'echo \">>> Строка $LINENO\" DEBUG' DEBUG\n\n# Остальной скрипт...\n",[46,149,150,156,163,174,179],{"__ignoreMap":104},[108,151,152],{"class":110,"line":111},[108,153,155],{"class":154},"sJ8bj","#!/usr/bin/env bash\n",[108,157,159],{"class":110,"line":158},2,[108,160,162],{"emptyLinePlaceholder":161},true,"\n",[108,164,166,168,171],{"class":110,"line":165},3,[108,167,139],{"class":117},[108,169,170],{"class":121}," 'echo \">>> Строка $LINENO\" DEBUG'",[108,172,173],{"class":121}," DEBUG\n",[108,175,177],{"class":110,"line":176},4,[108,178,162],{"emptyLinePlaceholder":161},[108,180,182],{"class":110,"line":181},5,[108,183,184],{"class":154},"# Остальной скрипт...\n",[21,186,187],{},"Теперь перед каждой командой будет выводиться сообщение с номером строки, что позволяет быстро найти проблемный участок.",[16,189,191],{"id":190},"шаг-3-включить-автоматическое-завершение-при-ошибке","Шаг 3: Включить автоматическое завершение при ошибке",[21,193,194,195,198],{},"Если скрипт должен завершаться при первой ошибке, добавьте ",[46,196,197],{},"set -e"," в начало.",[99,200,202],{"className":101,"code":201,"language":103,"meta":104,"style":104},"#!/usr/bin/env bash\nset -e  # завершать скрипт при любой ошибке\n\n# Основная логика скрипта...\n",[46,203,204,208,219,223],{"__ignoreMap":104},[108,205,206],{"class":110,"line":111},[108,207,155],{"class":154},[108,209,210,213,216],{"class":110,"line":158},[108,211,212],{"class":117},"set",[108,214,215],{"class":117}," -e",[108,217,218],{"class":154},"  # завершать скрипт при любой ошибке\n",[108,220,221],{"class":110,"line":165},[108,222,162],{"emptyLinePlaceholder":161},[108,224,225],{"class":110,"line":176},[108,226,227],{"class":154},"# Основная логика скрипта...\n",[21,229,230,231,233,234,59,237,240,241,244],{},"Внимание: ",[46,232,197],{}," не работает для команд в условных выражениях (",[46,235,236],{},"if",[46,238,239],{},"while","). Используйте ",[46,242,243],{},"set -o pipefail",", чтобы также завершать скрипт при ошибке в конвейере.",[16,246,248],{"id":247},"шаг-4-проверить-переменные-и-пути","Шаг 4: Проверить переменные и пути",[21,250,251,252,255],{},"Для отладки значений переменных добавьте ",[46,253,254],{},"set -x"," в нужных местах или напрямую выведите их.",[99,257,259],{"className":101,"code":258,"language":103,"meta":104,"style":104},"# внутри скрипта\necho \"DEBUG: значение переменной input_file = $input_file\"\n[ -f \"$input_file\" ] || { echo \"Ошибка: файл $input_file не найден\"; exit 1; }\n",[46,260,261,266,281],{"__ignoreMap":104},[108,262,263],{"class":110,"line":111},[108,264,265],{"class":154},"# внутри скрипта\n",[108,267,268,271,274,278],{"class":110,"line":158},[108,269,270],{"class":117},"echo",[108,272,273],{"class":121}," \"DEBUG: значение переменной input_file = ",[108,275,277],{"class":276},"sVt8B","$input_file",[108,279,280],{"class":121},"\"\n",[108,282,283,286,290,293,295,298,301,304,307,309,312,314,317,320,323,326],{"class":110,"line":165},[108,284,285],{"class":276},"[ ",[108,287,289],{"class":288},"szBVR","-f",[108,291,292],{"class":121}," \"",[108,294,277],{"class":276},[108,296,297],{"class":121},"\"",[108,299,300],{"class":276}," ] ",[108,302,303],{"class":288},"||",[108,305,306],{"class":276}," { ",[108,308,270],{"class":117},[108,310,311],{"class":121}," \"Ошибка: файл ",[108,313,277],{"class":276},[108,315,316],{"class":121}," не найден\"",[108,318,319],{"class":276},"; ",[108,321,322],{"class":117},"exit",[108,324,325],{"class":117}," 1",[108,327,328],{"class":276},"; }\n",[21,330,331,332,334],{},"Теперь вы увидите значения даже при включённом ",[46,333,254],{},", что полезно для скриптов, работающих с путями и файлами.",[16,336,338,339,341,342],{"id":337},"шаг-5-использовать-отладочные-инструменты-вроде-bashdb-или-gdb","Шаг 5: Использовать отладочные инструменты вроде ",[46,340,72],{}," или ",[46,343,344],{},"gdb",[21,346,347,348,350],{},"Для более продвинутой отладки установите ",[46,349,72],{}," (доступен в большинстве дистрибутивов).",[99,352,354],{"className":101,"code":353,"language":103,"meta":104,"style":104},"sudo apt install bashdb   # Debian/Ubuntu\nsudo dnf install bashdb   # Fedora\n",[46,355,356,373],{"__ignoreMap":104},[108,357,358,361,364,367,370],{"class":110,"line":111},[108,359,360],{"class":114},"sudo",[108,362,363],{"class":121}," apt",[108,365,366],{"class":121}," install",[108,368,369],{"class":121}," bashdb",[108,371,372],{"class":154},"   # Debian/Ubuntu\n",[108,374,375,377,380,382,384],{"class":110,"line":158},[108,376,360],{"class":114},[108,378,379],{"class":121}," dnf",[108,381,366],{"class":121},[108,383,369],{"class":121},[108,385,386],{"class":154},"   # Fedora\n",[21,388,389],{},"Затем запустите интерактивную сессию:",[99,391,393],{"className":101,"code":392,"language":103,"meta":104,"style":104},"bashdb script.sh\n",[46,394,395],{"__ignoreMap":104},[108,396,397,399],{"class":110,"line":111},[108,398,72],{"class":114},[108,400,122],{"class":121},[21,402,403,404,406,407,59,410,59,413,416,417,420],{},"Внутри ",[46,405,72],{}," вы можете использовать команды ",[46,408,409],{},"break",[46,411,412],{},"continue",[46,414,415],{},"step"," и ",[46,418,419],{},"print",", чтобы управлять выполнением и исследовать состояние скрипта.",[16,422,424],{"id":423},"шаг-6-проверить-права-доступа-к-скрипту","Шаг 6: Проверить права доступа к скрипту",[21,426,427],{},"Частая причина сбоев — отсутствие прав на выполнение.",[99,429,431],{"className":101,"code":430,"language":103,"meta":104,"style":104},"chmod +x script.sh\n",[46,432,433],{"__ignoreMap":104},[108,434,435,438,441],{"class":110,"line":111},[108,436,437],{"class":114},"chmod",[108,439,440],{"class":121}," +x",[108,442,122],{"class":121},[21,444,445,446,449,450,453,454,456,457,84],{},"Также убедитесь, что скрипт доступен для чтения (",[46,447,448],{},"-r","). Если у скрипта указан неправильный shebang (",[46,451,452],{},"#!/usr/bin/env bash","), убедитесь, что ",[46,455,103],{}," присутствует в ",[46,458,459],{},"$PATH",[16,461,463],{"id":462},"проверка-результата","Проверка результата",[21,465,466],{},"После внесения изменений перезапустите скрипт с той же отладочной информацией:",[99,468,469],{"className":101,"code":102,"language":103,"meta":104,"style":104},[46,470,471],{"__ignoreMap":104},[108,472,473,475,477],{"class":110,"line":111},[108,474,103],{"class":114},[108,476,118],{"class":117},[108,478,122],{"class":121},[21,480,481,482,485],{},"Если больше нет лишних строк вывода и скрипт завершается с кодом ",[46,483,484],{},"0",", отладка успешна. Для автоматизации вы можете записать лог в файл:",[99,487,489],{"className":101,"code":488,"language":103,"meta":104,"style":104},"bash -x script.sh > debug.log 2>&1\n",[46,490,491],{"__ignoreMap":104},[108,492,493,495,497,500,503,506],{"class":110,"line":111},[108,494,103],{"class":114},[108,496,118],{"class":117},[108,498,499],{"class":121}," script.sh",[108,501,502],{"class":288}," >",[108,504,505],{"class":121}," debug.log",[108,507,508],{"class":288}," 2>&1\n",[21,510,511,512,515],{},"Проверьте ",[46,513,514],{},"debug.log"," на наличие ошибок или unexpected значений.",[16,517,519],{"id":518},"возможные-проблемы","Возможные проблемы",[29,521,522,534,550,563],{},[32,523,524,527,528,73,530,533],{},[35,525,526],{},"Скрипт завершается со статусом 127"," – команда не найдена. Проверьте правильность написания и наличие её в ",[46,529,459],{},[46,531,532],{},"echo $PATH",").",[32,535,536,543,544,547,548,84],{},[35,537,538,540,541],{},[46,539,197],{}," не срабатывает внутри ",[46,542,236],{}," – оберните условие в ",[46,545,546],{},"|| true"," или используйте ",[46,549,243],{},[32,551,552,555,556,559,560,84],{},[35,553,554],{},"Скрипт зависает"," – возможно, бесконечный цикл. Используйте ",[46,557,558],{},"timeout"," для принудительного завершения: ",[46,561,562],{},"timeout 30 ./script.sh",[32,564,565,571,572,574,575,578],{},[35,566,567,568],{},"Нет вывода ",[46,569,570],{},"trap DEBUG"," – убедитесь, что ",[46,573,139],{}," определён ",[35,576,577],{},"перед"," выполнением кода скрипта (в начале файла).",[21,580,581],{},"Эти распространённые проблемы и их решения помогут быстро вернуть скрипт в рабочее состояние.",[583,584,585],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":104,"searchDepth":158,"depth":158,"links":587},[588,589,590,591,592,593,594,596,597,598],{"id":18,"depth":158,"text":19},{"id":26,"depth":158,"text":27},{"id":90,"depth":158,"text":91},{"id":132,"depth":158,"text":133},{"id":190,"depth":158,"text":191},{"id":247,"depth":158,"text":248},{"id":337,"depth":158,"text":595},"Шаг 5: Использовать отладочные инструменты вроде bashdb или gdb",{"id":423,"depth":158,"text":424},{"id":462,"depth":158,"text":463},{"id":518,"depth":158,"text":519},null,"2026-07-09 12:24:49","Пошаговая инструкция по отладке Bash-скриптов на Linux — 10 минут и скрипт будет работать. Узнайте, как использовать bash -x, set -e и отладочные инструменты.","medium",false,"10-15 мин","md",[607,610,613,616],{"question":608,"answer":609},"Как включить пошаговый режим отладки в Bash?","Запустите скрипт с ключом `-x`: `bash -x script.sh` — это выведет трассировку выполнения команд.",{"question":611,"answer":612},"Почему скрипт завершается со статусом 127?","Обычно это означает, что команда не найдена. Проверьте правильность написания и наличие её в PATH.",{"question":614,"answer":615},"Как избежать зависания скрипта при ошибке?","Добавьте `set -e` в начало скрипта — это заставит его завершиться при первой ошибке.",{"question":617,"answer":618},"Как отладить скрипт с использованием переменных и массивов?","Добавьте `set -x` перед печатью значений и проверьте значения с помощью `echo ${var}` внутри скрипта.",[620,623,626,629,632,635],{"name":621,"text":622},"Запустить скрипт с трассировкой","Используйте `bash -x script.sh`. Это покажет каждую выполненную команду, её параметры и текущее значение переменных.",{"name":624,"text":625},"Добавить точку останова с помощью trap","Добавьте `trap 'echo \"Остановка на строке $LINENO\"' DEBUG` — теперь перед каждой командой будет выводиться номер строки.",{"name":627,"text":628},"Включить автоматическое завершение при ошибке","Поместите `set -e` в начало скрипта — это предотвратит выполнение дальнейших команд при ошибке.",{"name":630,"text":631},"Проверить переменные и пути","Добавьте `set -x` и `echo \"DEBUG: $var\"` в нужных местах, чтобы увидеть значения переменных в процессе выполнения.",{"name":633,"text":634},"Использовать отладочные инструменты вроде `bashdb` или `gdb`","Установите `bashdb` (`sudo apt install bashdb`) и запустите `bashdb script.sh` для интерактивной отладки.",{"name":636,"text":637},"Проверить права доступа к скрипту","Убедитесь, что скрипт исполняем (`chmod +x script.sh`) и что у вас есть права на чтение и выполнение.","PT15M",[640,641,642,643,644,645,646,647],"отладка bash скрипта","bash -x скрипт.sh","отладить bash скрипт","set -e отладка","отладочные инструменты bash","bash отладка скрипта","bash ошибка скрипта","bash debug скрипта","ru_RU",{},"/guides/linux/debug-bash-script","linux",[653,654,655],"/guides/linux/debugging-shell-scripts","/guides/linux/use-bash-trap","/errors/linux/bash-permission-denied","Гайды Linux",{"title":5,"description":601},"guides/linux/debug-bash-script","В этом руководстве вы узнаете, как быстро выявлять и устранять ошибки в Bash-скриптах с помощью встроенных инструментов отладки. Мы покажем конкретные команды и объясним, что делать при распространённых проблемах.",[661,662,663,664,665,666],"Linux","Bash","отладка","скрипты","программирование","советы","guide","gvbFF0LhyXfQ-q7fzpd-_mT6ggfdm_1H1qqVXcystcU",{"data":670,"body":671},{},{"type":672,"children":673},"root",[674],{"type":675,"tag":21,"props":676,"children":677},"element",{},[678,681,686,688,694],{"type":679,"value":680},"text","Запустите скрипт с ключом ",{"type":675,"tag":46,"props":682,"children":684},{"className":683},[],[685],{"type":679,"value":97},{"type":679,"value":687},": ",{"type":675,"tag":46,"props":689,"children":691},{"className":690},[],[692],{"type":679,"value":693},"bash -x script.sh",{"type":679,"value":695}," — это выведет трассировку выполнения команд.",{"data":697,"body":698},{},{"type":672,"children":699},[700],{"type":675,"tag":21,"props":701,"children":702},{},[703],{"type":679,"value":612},{"data":705,"body":706},{},{"type":672,"children":707},[708],{"type":675,"tag":21,"props":709,"children":710},{},[711,713,718],{"type":679,"value":712},"Добавьте ",{"type":675,"tag":46,"props":714,"children":716},{"className":715},[],[717],{"type":679,"value":197},{"type":679,"value":719}," в начало скрипта — это заставит его завершиться при первой ошибке.",{"data":721,"body":722},{},{"type":672,"children":723},[724],{"type":675,"tag":21,"props":725,"children":726},{},[727,728,733,735,741],{"type":679,"value":712},{"type":675,"tag":46,"props":729,"children":731},{"className":730},[],[732],{"type":679,"value":254},{"type":679,"value":734}," перед печатью значений и проверьте значения с помощью ",{"type":675,"tag":46,"props":736,"children":738},{"className":737},[],[739],{"type":679,"value":740},"echo ${var}",{"type":679,"value":742}," внутри скрипта.",{"data":744,"body":745},{},{"type":672,"children":746},[747],{"type":675,"tag":21,"props":748,"children":749},{},[750,752,757],{"type":679,"value":751},"Используйте ",{"type":675,"tag":46,"props":753,"children":755},{"className":754},[],[756],{"type":679,"value":693},{"type":679,"value":758},". Это покажет каждую выполненную команду, её параметры и текущее значение переменных.",{"data":760,"body":761},{},{"type":672,"children":762},[763],{"type":675,"tag":21,"props":764,"children":765},{},[766,767,773],{"type":679,"value":712},{"type":675,"tag":46,"props":768,"children":770},{"className":769},[],[771],{"type":679,"value":772},"trap 'echo \"Остановка на строке $LINENO\"' DEBUG",{"type":679,"value":774}," — теперь перед каждой командой будет выводиться номер строки.",{"data":776,"body":777},{},{"type":672,"children":778},[779],{"type":675,"tag":21,"props":780,"children":781},{},[782,784,789],{"type":679,"value":783},"Поместите ",{"type":675,"tag":46,"props":785,"children":787},{"className":786},[],[788],{"type":679,"value":197},{"type":679,"value":790}," в начало скрипта — это предотвратит выполнение дальнейших команд при ошибке.",{"data":792,"body":793},{},{"type":672,"children":794},[795],{"type":675,"tag":21,"props":796,"children":797},{},[798,799,804,805,811],{"type":679,"value":712},{"type":675,"tag":46,"props":800,"children":802},{"className":801},[],[803],{"type":679,"value":254},{"type":679,"value":416},{"type":675,"tag":46,"props":806,"children":808},{"className":807},[],[809],{"type":679,"value":810},"echo \"DEBUG: $var\"",{"type":679,"value":812}," в нужных местах, чтобы увидеть значения переменных в процессе выполнения.",{"data":814,"body":815},{},{"type":672,"children":816},[817],{"type":675,"tag":21,"props":818,"children":819},{},[820,822,827,828,833,835,841],{"type":679,"value":821},"Установите ",{"type":675,"tag":46,"props":823,"children":825},{"className":824},[],[826],{"type":679,"value":72},{"type":679,"value":73},{"type":675,"tag":46,"props":829,"children":831},{"className":830},[],[832],{"type":679,"value":76},{"type":679,"value":834},") и запустите ",{"type":675,"tag":46,"props":836,"children":838},{"className":837},[],[839],{"type":679,"value":840},"bashdb script.sh",{"type":679,"value":842}," для интерактивной отладки.",{"data":844,"body":845},{},{"type":672,"children":846},[847],{"type":675,"tag":21,"props":848,"children":849},{},[850,852,858],{"type":679,"value":851},"Убедитесь, что скрипт исполняем (",{"type":675,"tag":46,"props":853,"children":855},{"className":854},[],[856],{"type":679,"value":857},"chmod +x script.sh",{"type":679,"value":859},") и что у вас есть права на чтение и выполнение.",[]]