[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/zsh-vs-bash":3,"mdc--aqiuku-key":487,"mdc-n99wdk-key":506,"mdc-7z7xa3-key":529,"mdc-gksj4-key":545,"mdc--37f1t-key":570,"mdc-6mfhwc-key":587,"mdc-soq6l0-key":611,"related-/guides/linux/setup-oh-my-zsh,/guides/linux/bash-scripting-basics,/guides/linux/terminal-shortcuts":628},{"id":4,"title":5,"appliesTo":6,"author":10,"body":11,"canonical":427,"code":427,"createdAt":428,"description":429,"difficulty":430,"draft":431,"estimatedTime":432,"extension":433,"faq":434,"howToSteps":444,"howToTotalTime":457,"image":427,"keywords":458,"locale":466,"meta":467,"navigation":468,"path":469,"platform":470,"related":471,"section":475,"seo":476,"severity":427,"stem":477,"summary":478,"tags":479,"twitterCreator":427,"twitterSite":427,"type":485,"updatedAt":428,"__hash__":486},"content_ru/guides/linux/zsh-vs-bash.md","Zsh vs Bash: выбираем лучшую оболочку и настраиваем Linux",[7,8,9],"Ubuntu 22.04/24.04","Debian 11/12","Fedora 38+","FixPedia Team",{"type":12,"value":13,"toc":418},"minimark",[14,19,23,26,30,38,74,77,81,84,87,116,119,135,138,141,145,148,174,185,189,200,229,232,295,298,310,315,319,322,335,361,365,414],[15,16,18],"h2",{"id":17},"зачем-выбирать-между-zsh-и-bash","Зачем выбирать между Zsh и Bash",[20,21,22],"p",{},"Терминал остаётся основным рабочим пространством для разработчиков и системных администраторов. Bash десятилетиями был отраслевым стандартом благодаря стабильности и повсеместной поддержке, но Zsh предлагает более интеллектуальные функции из коробки. К ним относятся контекстное автодополнение, обратный поиск с учётом частоты использования, глоб-паттерны и встроенная поддержка тем оформления.",[20,24,25],{},"Переход на Zsh не требует удаления Bash и полностью обратим. Вы получите ускоренную работу с командами, снижение количества опечаток и готовую экосистему плагинов, при этом сохранив совместимость со всеми вашими Bash-скриптами.",[15,27,29],{"id":28},"требования-и-подготовка","Требования и подготовка",[20,31,32,33,37],{},"Перед началом убедитесь, что у вас есть права ",[34,35,36],"code",{},"sudo"," для установки системных пакетов. Рекомендуется создать резервную копию текущих конфигурационных файлов:",[39,40,45],"pre",{"className":41,"code":42,"language":43,"meta":44,"style":44},"language-bash shiki shiki-themes github-light github-dark","cp ~/.bashrc ~/.bashrc.bak\ncp ~/.profile ~/.profile.bak\n","bash","",[34,46,47,63],{"__ignoreMap":44},[48,49,52,56,60],"span",{"class":50,"line":51},"line",1,[48,53,55],{"class":54},"sScJk","cp",[48,57,59],{"class":58},"sZZnC"," ~/.bashrc",[48,61,62],{"class":58}," ~/.bashrc.bak\n",[48,64,66,68,71],{"class":50,"line":65},2,[48,67,55],{"class":54},[48,69,70],{"class":58}," ~/.profile",[48,72,73],{"class":58}," ~/.profile.bak\n",[20,75,76],{},"Это позволит быстро восстановить прежние алиасы и переменные окружения, если они потребуются в процессе миграции.",[15,78,80],{"id":79},"шаг-1-установка-пакета","Шаг 1: Установка пакета",[20,82,83],{},"В современных дистрибутивах интерпретатор доступен в стандартных репозиториях. Откройте терминал и выполните команду, соответствующую вашей системе:",[20,85,86],{},"Для Debian и Ubuntu:",[39,88,90],{"className":41,"code":89,"language":43,"meta":44,"style":44},"sudo apt update && sudo apt install zsh\n",[34,91,92],{"__ignoreMap":44},[48,93,94,96,99,102,106,108,110,113],{"class":50,"line":51},[48,95,36],{"class":54},[48,97,98],{"class":58}," apt",[48,100,101],{"class":58}," update",[48,103,105],{"class":104},"sVt8B"," && ",[48,107,36],{"class":54},[48,109,98],{"class":58},[48,111,112],{"class":58}," install",[48,114,115],{"class":58}," zsh\n",[20,117,118],{},"Для Fedora и RHEL-подобных систем:",[39,120,122],{"className":41,"code":121,"language":43,"meta":44,"style":44},"sudo dnf install zsh\n",[34,123,124],{"__ignoreMap":44},[48,125,126,128,131,133],{"class":50,"line":51},[48,127,36],{"class":54},[48,129,130],{"class":58}," dnf",[48,132,112],{"class":58},[48,134,115],{"class":58},[20,136,137],{},"Команда обновит кэш пакетов, проверит зависимости и скачает последнюю стабильную версию Zsh. Процесс занимает не более минуты при стабильном соединении.",[139,140],"in-article-ad",{},[15,142,144],{"id":143},"шаг-2-активация-оболочки-по-умолчанию","Шаг 2: Активация оболочки по умолчанию",[20,146,147],{},"После установки система не переключится автоматически. Укажите Zsh как основную среду для текущего пользователя:",[39,149,151],{"className":41,"code":150,"language":43,"meta":44,"style":44},"chsh -s $(which zsh)\n",[34,152,153],{"__ignoreMap":44},[48,154,155,158,162,165,168,171],{"class":50,"line":51},[48,156,157],{"class":54},"chsh",[48,159,161],{"class":160},"sj4cs"," -s",[48,163,164],{"class":104}," $(",[48,166,167],{"class":160},"which",[48,169,170],{"class":58}," zsh",[48,172,173],{"class":104},")\n",[20,175,176,177,180,181,184],{},"Флаг ",[34,178,179],{},"-s"," задаёт абсолютный путь к исполняемому файлу, а конструкция ",[34,182,183],{},"$(which zsh)"," подставляет его автоматически. Для вступления изменений в силу полностью закройте все окна терминала и откройте новое.",[15,186,188],{"id":187},"шаг-3-перенос-настроек-и-оптимизация","Шаг 3: Перенос настроек и оптимизация",[20,190,191,192,195,196,199],{},"При первом запуске появится мастер настройки. Нажмите ",[34,193,194],{},"0"," для выхода без создания дефолтного конфига — мы настроим его вручную. Откройте ",[34,197,198],{},"~/.zshrc"," в текстовом редакторе и перенесите рабочие алиасы:",[39,201,203],{"className":41,"code":202,"language":43,"meta":44,"style":44},"cat ~/.bashrc.bak | grep \"^alias\" >> ~/.zshrc\n",[34,204,205],{"__ignoreMap":44},[48,206,207,210,213,217,220,223,226],{"class":50,"line":51},[48,208,209],{"class":54},"cat",[48,211,212],{"class":58}," ~/.bashrc.bak",[48,214,216],{"class":215},"szBVR"," |",[48,218,219],{"class":54}," grep",[48,221,222],{"class":58}," \"^alias\"",[48,224,225],{"class":215}," >>",[48,227,228],{"class":58}," ~/.zshrc\n",[20,230,231],{},"Добавьте в конец файла параметры, улучшающие опыт работы:",[39,233,235],{"className":41,"code":234,"language":43,"meta":44,"style":44},"# Игнорировать регистр при автодополнении\nzstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'\n# Отключить автоскрытие курсора при вводе\nunsetopt beep\n# Включить подсветку синтаксиса (если установлен плагин)\nautoload -U colors && colors\n",[34,236,237,243,257,263,272,278],{"__ignoreMap":44},[48,238,239],{"class":50,"line":51},[48,240,242],{"class":241},"sJ8bj","# Игнорировать регистр при автодополнении\n",[48,244,245,248,251,254],{"class":50,"line":65},[48,246,247],{"class":54},"zstyle",[48,249,250],{"class":58}," ':completion:*'",[48,252,253],{"class":58}," matcher-list",[48,255,256],{"class":58}," 'm:{a-zA-Z}={A-Za-z}'\n",[48,258,260],{"class":50,"line":259},3,[48,261,262],{"class":241},"# Отключить автоскрытие курсора при вводе\n",[48,264,266,269],{"class":50,"line":265},4,[48,267,268],{"class":160},"unsetopt",[48,270,271],{"class":58}," beep\n",[48,273,275],{"class":50,"line":274},5,[48,276,277],{"class":241},"# Включить подсветку синтаксиса (если установлен плагин)\n",[48,279,281,284,287,290,292],{"class":50,"line":280},6,[48,282,283],{"class":160},"autoload",[48,285,286],{"class":160}," -U",[48,288,289],{"class":58}," colors",[48,291,105],{"class":104},[48,293,294],{"class":54},"colors\n",[20,296,297],{},"Примените изменения без перезапуска:",[39,299,301],{"className":41,"code":300,"language":43,"meta":44,"style":44},"source ~/.zshrc\n",[34,302,303],{"__ignoreMap":44},[48,304,305,308],{"class":50,"line":51},[48,306,307],{"class":160},"source",[48,309,228],{"class":58},[20,311,312,314],{},[34,313,307],{}," загружает конфигурацию в текущий сеанс, позволяя сразу тестировать новые правила.",[15,316,318],{"id":317},"проверка-результата","Проверка результата",[20,320,321],{},"Откройте новое окно терминала и выполните:",[39,323,325],{"className":41,"code":324,"language":43,"meta":44,"style":44},"echo $SHELL\n",[34,326,327],{"__ignoreMap":44},[48,328,329,332],{"class":50,"line":51},[48,330,331],{"class":160},"echo",[48,333,334],{"class":104}," $SHELL\n",[20,336,337,338,341,342,345,346,349,350,353,354,353,357,360],{},"Вывод ",[34,339,340],{},"/usr/bin/zsh"," подтверждает успешную смену. Проверьте работу автодополнения: введите ",[34,343,344],{},"git s"," и нажмите ",[34,347,348],{},"Tab"," дважды. Оболочка предложит ",[34,351,352],{},"status",", ",[34,355,356],{},"shortlog",[34,358,359],{},"show"," и другие варианты. Убедитесь, что перенесённые алиасы срабатывают корректно.",[15,362,364],{"id":363},"возможные-проблемы-и-решения","Возможные проблемы и решения",[366,367,368,380,397],"ul",{},[369,370,371,375,376,379],"li",{},[372,373,374],"strong",{},"Ошибки выполнения существующих скриптов."," Zsh использует отличные от Bash правила раскрытия кавычек и массивов. Всегда указывайте интерпретатор явно в начале файла: ",[34,377,378],{},"#!/usr/bin/env bash",". Это гарантирует, что система вызовет Bash, а не Zsh.",[369,381,382,389,390,392,393,396],{},[372,383,384,385,388],{},"Пропали переменные ",[34,386,387],{},"PATH","."," Убедитесь, что в ",[34,391,198],{}," присутствует строка экспорта системных путей. Добавьте ",[34,394,395],{},"export PATH=\"/usr/local/bin:$PATH\""," в начало файла, чтобы приоритет отдавался пользовательским утилитам.",[369,398,399,402,403,405,406,409,410,413],{},[372,400,401],{},"Медленная загрузка терминала."," Причиной обычно становятся тяжёлые плагины или неоптимизированный ",[34,404,198],{},". Запустите профилировщик: ",[34,407,408],{},"zsh -xv"," и найдите этапы, занимающие более 200 мс. Закомментируйте проблемные секции или используйте ",[34,411,412],{},"zsh-autosuggestions"," вместо тяжёлых фреймворков.",[415,416,417],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":44,"searchDepth":65,"depth":65,"links":419},[420,421,422,423,424,425,426],{"id":17,"depth":65,"text":18},{"id":28,"depth":65,"text":29},{"id":79,"depth":65,"text":80},{"id":143,"depth":65,"text":144},{"id":187,"depth":65,"text":188},{"id":317,"depth":65,"text":318},{"id":363,"depth":65,"text":364},null,"2026-04-06 10:39:32","Пошаговое сравнение Zsh и Bash: выберите лучшую оболочку, настройте автодополнение и тему за 10 минут. Оптимизируйте работу в терминале уже сегодня!","easy",false,"10-15 мин","md",[435,438,441],{"question":436,"answer":437},"Можно ли запускать Bash-скрипты внутри Zsh?","Да, если в первой строке файла указан шебанг `#!/usr/bin/env bash`. Zsh корректно вызовет системный Bash для выполнения кода, игнорируя синтаксические различия.",{"question":439,"answer":440},"Что делать, если после смены терминал перестал открываться?","Войдите в TTY (Ctrl+Alt+F3), выполните `chsh -s /bin/bash` и перезапустите сессию. Ошибка обычно возникает из-за некорректного синтаксиса в `~/.zshrc`.",{"question":442,"answer":443},"Нужен ли oh-my-zsh для работы Zsh?","Нет, это лишь популярный фреймворк для упрощения настройки. Базовая Zsh работает стабильно из коробки, а ручное редактирование `~/.zshrc` снижает потребление оперативной памяти.",[445,448,451,454],{"name":446,"text":447},"Установка пакета Zsh","Используйте `sudo apt install zsh` или `sudo dnf install zsh` для загрузки интерпретатора из официальных репозиториев.",{"name":449,"text":450},"Смена оболочки по умолчанию","Выполните `chsh -s $(which zsh)` для привязки нового интерпретатора к вашему пользователю. Перезапустите терминал.",{"name":452,"text":453},"Миграция конфигурации","Скопируйте алиасы из `~/.bashrc` в новый файл `~/.zshrc` и добавьте параметры автодополнения.",{"name":455,"text":456},"Проверка работы и отладка","Убедитесь через `echo $SHELL`, что оболочка сменилась. Протестируйте автодополнение и проверьте запуск старых команд.","PT15M",[459,460,461,462,463,464,465],"zsh vs bash что лучше","как перейти на zsh в linux","настройка oh-my-zsh ubuntu","преимущества zsh над bash","смена оболочки по умолчанию chsh","конфигурация .zshrc для разработчика","bash или zsh сравнение","ru_RU",{},true,"/guides/linux/zsh-vs-bash","linux",[472,473,474],"/guides/linux/setup-oh-my-zsh","/guides/linux/bash-scripting-basics","/guides/linux/terminal-shortcuts","Гайды Linux",{"title":5,"description":429},"guides/linux/zsh-vs-bash","Разбираем ключевые отличия популярных командных оболочек Linux и показываем, как безопасно мигрировать с Bash на Zsh. Вы получите современный терминал с плагинами без потери функционала.",[480,481,482,483,484,43],"терминал","оболочка","cli","настройка linux","zsh","guide","vif0c3dCx2dxnNYg_uu4T6H0Lj52Hn8leZJt4w-gPOg",{"data":488,"body":489},{},{"type":490,"children":491},"root",[492],{"type":493,"tag":20,"props":494,"children":495},"element",{},[496,499,504],{"type":497,"value":498},"text","Да, если в первой строке файла указан шебанг ",{"type":493,"tag":34,"props":500,"children":502},{"className":501},[],[503],{"type":497,"value":378},{"type":497,"value":505},". Zsh корректно вызовет системный Bash для выполнения кода, игнорируя синтаксические различия.",{"data":507,"body":508},{},{"type":490,"children":509},[510],{"type":493,"tag":20,"props":511,"children":512},{},[513,515,521,523,528],{"type":497,"value":514},"Войдите в TTY (Ctrl+Alt+F3), выполните ",{"type":493,"tag":34,"props":516,"children":518},{"className":517},[],[519],{"type":497,"value":520},"chsh -s /bin/bash",{"type":497,"value":522}," и перезапустите сессию. Ошибка обычно возникает из-за некорректного синтаксиса в ",{"type":493,"tag":34,"props":524,"children":526},{"className":525},[],[527],{"type":497,"value":198},{"type":497,"value":388},{"data":530,"body":531},{},{"type":490,"children":532},[533],{"type":493,"tag":20,"props":534,"children":535},{},[536,538,543],{"type":497,"value":537},"Нет, это лишь популярный фреймворк для упрощения настройки. Базовая Zsh работает стабильно из коробки, а ручное редактирование ",{"type":493,"tag":34,"props":539,"children":541},{"className":540},[],[542],{"type":497,"value":198},{"type":497,"value":544}," снижает потребление оперативной памяти.",{"data":546,"body":547},{},{"type":490,"children":548},[549],{"type":493,"tag":20,"props":550,"children":551},{},[552,554,560,562,568],{"type":497,"value":553},"Используйте ",{"type":493,"tag":34,"props":555,"children":557},{"className":556},[],[558],{"type":497,"value":559},"sudo apt install zsh",{"type":497,"value":561}," или ",{"type":493,"tag":34,"props":563,"children":565},{"className":564},[],[566],{"type":497,"value":567},"sudo dnf install zsh",{"type":497,"value":569}," для загрузки интерпретатора из официальных репозиториев.",{"data":571,"body":572},{},{"type":490,"children":573},[574],{"type":493,"tag":20,"props":575,"children":576},{},[577,579,585],{"type":497,"value":578},"Выполните ",{"type":493,"tag":34,"props":580,"children":582},{"className":581},[],[583],{"type":497,"value":584},"chsh -s $(which zsh)",{"type":497,"value":586}," для привязки нового интерпретатора к вашему пользователю. Перезапустите терминал.",{"data":588,"body":589},{},{"type":490,"children":590},[591],{"type":493,"tag":20,"props":592,"children":593},{},[594,596,602,604,609],{"type":497,"value":595},"Скопируйте алиасы из ",{"type":493,"tag":34,"props":597,"children":599},{"className":598},[],[600],{"type":497,"value":601},"~/.bashrc",{"type":497,"value":603}," в новый файл ",{"type":493,"tag":34,"props":605,"children":607},{"className":606},[],[608],{"type":497,"value":198},{"type":497,"value":610}," и добавьте параметры автодополнения.",{"data":612,"body":613},{},{"type":490,"children":614},[615],{"type":493,"tag":20,"props":616,"children":617},{},[618,620,626],{"type":497,"value":619},"Убедитесь через ",{"type":493,"tag":34,"props":621,"children":623},{"className":622},[],[624],{"type":497,"value":625},"echo $SHELL",{"type":497,"value":627},", что оболочка сменилась. Протестируйте автодополнение и проверьте запуск старых команд.",[629],{"id":630,"title":631,"appliesTo":632,"author":10,"body":637,"canonical":427,"code":427,"createdAt":1668,"description":1669,"difficulty":430,"draft":431,"estimatedTime":1670,"extension":433,"faq":1671,"howToSteps":1684,"howToTotalTime":1700,"image":427,"keywords":1701,"locale":466,"meta":1713,"navigation":468,"path":473,"platform":470,"related":1714,"section":475,"seo":1718,"severity":427,"stem":1719,"summary":1720,"tags":1721,"twitterCreator":427,"twitterSite":427,"type":485,"updatedAt":1668,"__hash__":1725},"content_ru/guides/linux/bash-scripting-basics.md","Bash скриптинг: основы для начинающих",[633,634,635,636],"Bash 4.0+","Ubuntu 20.04+","Debian 10+","CentOS 7+",{"type":12,"value":638,"toc":1658},[639,642,647,658,675,688,704,707,716,734,738,745,773,776,802,805,834,841,914,920,931,935,938,985,990,1050,1055,1115,1129,1133,1136,1144,1240,1247,1305,1313,1355,1364,1368,1371,1465,1486,1490,1493,1526,1530,1599,1603,1606,1652,1655],[20,640,641],{},"Bash-скриптинг — основной способ автоматизации в Linux. С помощью скриптов вы объединяете команды, создаёте собственные утилиты и убираете рутинные действия. Этот гайд покажет, как создать первый скрипт, работать с переменными, условиями, циклами и функциями. Вы сможете писать простые, но эффективные скрипты сразу после прочтения.",[643,644,646],"h3",{"id":645},"создание-и-запуск-первого-скрипта","Создание и запуск первого скрипта",[20,648,649,650,653,654,657],{},"Начнём с минимального рабочего примера. Создайте файл ",[34,651,652],{},"hello.sh"," и откройте его в редакторе (",[34,655,656],{},"nano hello.sh","). Добавьте содержимое:",[39,659,661],{"className":41,"code":660,"language":43,"meta":44,"style":44},"#!/usr/bin/env bash\necho \"Привет, мир!\"\n",[34,662,663,668],{"__ignoreMap":44},[48,664,665],{"class":50,"line":51},[48,666,667],{"class":241},"#!/usr/bin/env bash\n",[48,669,670,672],{"class":50,"line":65},[48,671,331],{"class":160},[48,673,674],{"class":58}," \"Привет, мир!\"\n",[20,676,677,678,353,681,353,684,687],{},"Сохраните файл (",[34,679,680],{},"Ctrl+O",[34,682,683],{},"Enter",[34,685,686],{},"Ctrl+X"," в nano). Сделайте его исполняемым:",[39,689,691],{"className":41,"code":690,"language":43,"meta":44,"style":44},"chmod +x hello.sh\n",[34,692,693],{"__ignoreMap":44},[48,694,695,698,701],{"class":50,"line":51},[48,696,697],{"class":54},"chmod",[48,699,700],{"class":58}," +x",[48,702,703],{"class":58}," hello.sh\n",[20,705,706],{},"Запустите из той же директории:",[39,708,710],{"className":41,"code":709,"language":43,"meta":44,"style":44},"./hello.sh\n",[34,711,712],{"__ignoreMap":44},[48,713,714],{"class":50,"line":51},[48,715,709],{"class":54},[20,717,718,719,722,723,726,727,730,731,388],{},"Вывод: ",[34,720,721],{},"Привет, мир!",". Если видите ",[34,724,725],{},"Permission denied",", проверьте права через ",[34,728,729],{},"ls -l hello.sh"," и повторно выполните ",[34,732,733],{},"chmod +x",[643,735,737],{"id":736},"переменные-и-аргументы-командной-строки","Переменные и аргументы командной строки",[20,739,740,741,744],{},"Переменные хранят данные для повторного использования. Объявляйте без пробелов вокруг ",[34,742,743],{},"=",":",[39,746,748],{"className":41,"code":747,"language":43,"meta":44,"style":44},"USERNAME=\"Алексей\"\necho \"Добро пожаловать, $USERNAME!\"\n",[34,749,750,760],{"__ignoreMap":44},[48,751,752,755,757],{"class":50,"line":51},[48,753,754],{"class":104},"USERNAME",[48,756,743],{"class":215},[48,758,759],{"class":58},"\"Алексей\"\n",[48,761,762,764,767,770],{"class":50,"line":65},[48,763,331],{"class":160},[48,765,766],{"class":58}," \"Добро пожаловать, ",[48,768,769],{"class":104},"$USERNAME",[48,771,772],{"class":58},"!\"\n",[20,774,775],{},"Для кавычек внутри значений используйте экранирование или внешние кавычки:",[39,777,779],{"className":41,"code":778,"language":43,"meta":44,"style":44},"MESSAGE=\"Он сказал: \\\"Привет!\\\"\"\n",[34,780,781],{"__ignoreMap":44},[48,782,783,786,788,791,794,797,799],{"class":50,"line":51},[48,784,785],{"class":104},"MESSAGE",[48,787,743],{"class":215},[48,789,790],{"class":58},"\"Он сказал: ",[48,792,793],{"class":160},"\\\"",[48,795,796],{"class":58},"Привет!",[48,798,793],{"class":160},[48,800,801],{"class":58},"\"\n",[20,803,804],{},"Аргументы делают скрипт гибким. Доступ к ним:",[366,806,807,816,822,828],{},[369,808,809,353,812,815],{},[34,810,811],{},"$1",[34,813,814],{},"$2"," — первый, второй аргумент.",[369,817,818,821],{},[34,819,820],{},"$@"," — все аргументы как отдельные слова.",[369,823,824,827],{},[34,825,826],{},"$#"," — количество аргументов.",[369,829,830,833],{},[34,831,832],{},"$0"," — имя скрипта.",[20,835,836,837,840],{},"Пример ",[34,838,839],{},"greet.sh"," с проверкой аргументов:",[39,842,844],{"className":41,"code":843,"language":43,"meta":44,"style":44},"#!/usr/bin/env bash\nif [ $# -eq 0 ]; then\n    echo \"Использование: $0 \u003Cимя>\"\n    exit 1\nfi\necho \"Привет, $1! Получено аргументов: $#\"\n",[34,845,846,850,872,885,893,898],{"__ignoreMap":44},[48,847,848],{"class":50,"line":51},[48,849,667],{"class":241},[48,851,852,855,858,860,863,866,869],{"class":50,"line":65},[48,853,854],{"class":215},"if",[48,856,857],{"class":104}," [ ",[48,859,826],{"class":160},[48,861,862],{"class":215}," -eq",[48,864,865],{"class":160}," 0",[48,867,868],{"class":104}," ]; ",[48,870,871],{"class":215},"then\n",[48,873,874,877,880,882],{"class":50,"line":259},[48,875,876],{"class":160},"    echo",[48,878,879],{"class":58}," \"Использование: ",[48,881,832],{"class":160},[48,883,884],{"class":58}," \u003Cимя>\"\n",[48,886,887,890],{"class":50,"line":265},[48,888,889],{"class":160},"    exit",[48,891,892],{"class":160}," 1\n",[48,894,895],{"class":50,"line":274},[48,896,897],{"class":215},"fi\n",[48,899,900,902,905,907,910,912],{"class":50,"line":280},[48,901,331],{"class":160},[48,903,904],{"class":58}," \"Привет, ",[48,906,811],{"class":160},[48,908,909],{"class":58},"! Получено аргументов: ",[48,911,826],{"class":160},[48,913,801],{"class":58},[20,915,916,917,388],{},"Запуск: ",[34,918,919],{},"./greet.sh Мария",[921,922,925],"image-with-caption",{"alt":923,"src":924},"Пример bash-скрипта с переменными и аргументами командной строки","/images/guides/linux/bash-scripting-basics/bash-variables-arguments-example.png",[20,926,927],{},[928,929,930],"em",{},"Использование переменных и аргументов в bash-скрипте",[643,932,934],{"id":933},"условные-операторы-if","Условные операторы if",[20,936,937],{},"Условия позволяют ветвить логику. Базовый синтаксис:",[39,939,941],{"className":41,"code":940,"language":43,"meta":44,"style":44},"if [ условие ]; then\n    команды\nelif [ другое_условие ]; then\n    команды\nelse\n    команды\nfi\n",[34,942,943,952,957,967,971,976,980],{"__ignoreMap":44},[48,944,945,947,950],{"class":50,"line":51},[48,946,854],{"class":215},[48,948,949],{"class":104}," [ условие ]; ",[48,951,871],{"class":215},[48,953,954],{"class":50,"line":65},[48,955,956],{"class":54},"    команды\n",[48,958,959,962,965],{"class":50,"line":259},[48,960,961],{"class":215},"elif",[48,963,964],{"class":104}," [ другое_условие ]; ",[48,966,871],{"class":215},[48,968,969],{"class":50,"line":265},[48,970,956],{"class":54},[48,972,973],{"class":50,"line":274},[48,974,975],{"class":215},"else\n",[48,977,978],{"class":50,"line":280},[48,979,956],{"class":54},[48,981,983],{"class":50,"line":982},7,[48,984,897],{"class":215},[20,986,987],{},[372,988,989],{},"Пример: проверка количества аргументов",[39,991,993],{"className":41,"code":992,"language":43,"meta":44,"style":44},"#!/usr/bin/env bash\nif [ $# -lt 2 ]; then\n    echo \"Ошибка: нужно два аргумента.\"\n    exit 1\nfi\necho \"Аргументы: $1 и $2\"\n",[34,994,995,999,1017,1024,1030,1034],{"__ignoreMap":44},[48,996,997],{"class":50,"line":51},[48,998,667],{"class":241},[48,1000,1001,1003,1005,1007,1010,1013,1015],{"class":50,"line":65},[48,1002,854],{"class":215},[48,1004,857],{"class":104},[48,1006,826],{"class":160},[48,1008,1009],{"class":215}," -lt",[48,1011,1012],{"class":160}," 2",[48,1014,868],{"class":104},[48,1016,871],{"class":215},[48,1018,1019,1021],{"class":50,"line":259},[48,1020,876],{"class":160},[48,1022,1023],{"class":58}," \"Ошибка: нужно два аргумента.\"\n",[48,1025,1026,1028],{"class":50,"line":265},[48,1027,889],{"class":160},[48,1029,892],{"class":160},[48,1031,1032],{"class":50,"line":274},[48,1033,897],{"class":215},[48,1035,1036,1038,1041,1043,1046,1048],{"class":50,"line":280},[48,1037,331],{"class":160},[48,1039,1040],{"class":58}," \"Аргументы: ",[48,1042,811],{"class":160},[48,1044,1045],{"class":58}," и ",[48,1047,814],{"class":160},[48,1049,801],{"class":58},[20,1051,1052],{},[372,1053,1054],{},"Операторы сравнения:",[366,1056,1057,1084,1100],{},[369,1058,1059,1060,1063,1064,1067,1068,1071,1072,1075,1076,1079,1080,1083],{},"Числа: ",[34,1061,1062],{},"-eq"," (равно), ",[34,1065,1066],{},"-ne"," (не равно), ",[34,1069,1070],{},"-lt"," (меньше), ",[34,1073,1074],{},"-le"," (меньше или равно), ",[34,1077,1078],{},"-gt"," (больше), ",[34,1081,1082],{},"-ge"," (больше или равно).",[369,1085,1086,1087,1063,1089,1067,1092,1095,1096,1099],{},"Строки: ",[34,1088,743],{},[34,1090,1091],{},"!=",[34,1093,1094],{},"-z"," (пустая строка), ",[34,1097,1098],{},"-n"," (не пустая).",[369,1101,1102,1103,1106,1107,1110,1111,1114],{},"Файлы: ",[34,1104,1105],{},"-e"," (существует), ",[34,1108,1109],{},"-f"," (обычный файл), ",[34,1112,1113],{},"-d"," (директория).",[1116,1117,1118],"blockquote",{},[20,1119,1120,1121,1124,1125,1128],{},"💡 ",[372,1122,1123],{},"Совет:"," Всегда заключайте переменные в двойные кавычки: ",[34,1126,1127],{},"[ -n \"$VAR\" ]",". Это предотвратит ошибки, если переменная пуста или содержит пробелы.",[643,1130,1132],{"id":1131},"циклы","Циклы",[20,1134,1135],{},"Циклы повторяют блок кода.",[20,1137,1138],{},[372,1139,1140,1141,744],{},"Цикл ",[34,1142,1143],{},"for",[39,1145,1147],{"className":41,"code":1146,"language":43,"meta":44,"style":44},"# Перебор списка\nfor fruit in яблоко банан апельсин; do\n    echo \"Фрукт: $fruit\"\ndone\n\n# Перебор файлов .log\nfor log in *.log; do\n    echo \"Обработка $log\"\ndone\n",[34,1148,1149,1154,1179,1191,1196,1201,1206,1222,1235],{"__ignoreMap":44},[48,1150,1151],{"class":50,"line":51},[48,1152,1153],{"class":241},"# Перебор списка\n",[48,1155,1156,1158,1161,1164,1167,1170,1173,1176],{"class":50,"line":65},[48,1157,1143],{"class":215},[48,1159,1160],{"class":104}," fruit ",[48,1162,1163],{"class":215},"in",[48,1165,1166],{"class":58}," яблоко",[48,1168,1169],{"class":58}," банан",[48,1171,1172],{"class":58}," апельсин",[48,1174,1175],{"class":104},"; ",[48,1177,1178],{"class":215},"do\n",[48,1180,1181,1183,1186,1189],{"class":50,"line":259},[48,1182,876],{"class":160},[48,1184,1185],{"class":58}," \"Фрукт: ",[48,1187,1188],{"class":104},"$fruit",[48,1190,801],{"class":58},[48,1192,1193],{"class":50,"line":265},[48,1194,1195],{"class":215},"done\n",[48,1197,1198],{"class":50,"line":274},[48,1199,1200],{"emptyLinePlaceholder":468},"\n",[48,1202,1203],{"class":50,"line":280},[48,1204,1205],{"class":241},"# Перебор файлов .log\n",[48,1207,1208,1210,1213,1215,1218,1220],{"class":50,"line":982},[48,1209,1143],{"class":215},[48,1211,1212],{"class":104}," log ",[48,1214,1163],{"class":215},[48,1216,1217],{"class":58}," *.log",[48,1219,1175],{"class":104},[48,1221,1178],{"class":215},[48,1223,1225,1227,1230,1233],{"class":50,"line":1224},8,[48,1226,876],{"class":160},[48,1228,1229],{"class":58}," \"Обработка ",[48,1231,1232],{"class":104},"$log",[48,1234,801],{"class":58},[48,1236,1238],{"class":50,"line":1237},9,[48,1239,1195],{"class":215},[20,1241,1242],{},[372,1243,1140,1244,744],{},[34,1245,1246],{},"while",[39,1248,1250],{"className":41,"code":1249,"language":43,"meta":44,"style":44},"counter=1\nwhile [ $counter -le 5 ]; do\n    echo \"Счётчик: $counter\"\n    ((counter++))\ndone\n",[34,1251,1252,1262,1278,1290,1301],{"__ignoreMap":44},[48,1253,1254,1257,1259],{"class":50,"line":51},[48,1255,1256],{"class":104},"counter",[48,1258,743],{"class":215},[48,1260,1261],{"class":58},"1\n",[48,1263,1264,1266,1269,1271,1274,1276],{"class":50,"line":65},[48,1265,1246],{"class":215},[48,1267,1268],{"class":104}," [ $counter ",[48,1270,1074],{"class":215},[48,1272,1273],{"class":160}," 5",[48,1275,868],{"class":104},[48,1277,1178],{"class":215},[48,1279,1280,1282,1285,1288],{"class":50,"line":259},[48,1281,876],{"class":160},[48,1283,1284],{"class":58}," \"Счётчик: ",[48,1286,1287],{"class":104},"$counter",[48,1289,801],{"class":58},[48,1291,1292,1295,1298],{"class":50,"line":265},[48,1293,1294],{"class":104},"    ((counter",[48,1296,1297],{"class":215},"++",[48,1299,1300],{"class":104},"))\n",[48,1302,1303],{"class":50,"line":274},[48,1304,1195],{"class":215},[20,1306,1307,1312],{},[372,1308,1140,1309],{},[34,1310,1311],{},"until"," (выполняется, пока условие ложно):",[39,1314,1316],{"className":41,"code":1315,"language":43,"meta":44,"style":44},"until [ $counter -gt 5 ]; do\n    echo \"Значение: $counter\"\n    ((counter++))\ndone\n",[34,1317,1318,1332,1343,1351],{"__ignoreMap":44},[48,1319,1320,1322,1324,1326,1328,1330],{"class":50,"line":51},[48,1321,1311],{"class":215},[48,1323,1268],{"class":104},[48,1325,1078],{"class":215},[48,1327,1273],{"class":160},[48,1329,868],{"class":104},[48,1331,1178],{"class":215},[48,1333,1334,1336,1339,1341],{"class":50,"line":65},[48,1335,876],{"class":160},[48,1337,1338],{"class":58}," \"Значение: ",[48,1340,1287],{"class":104},[48,1342,801],{"class":58},[48,1344,1345,1347,1349],{"class":50,"line":259},[48,1346,1294],{"class":104},[48,1348,1297],{"class":215},[48,1350,1300],{"class":104},[48,1352,1353],{"class":50,"line":265},[48,1354,1195],{"class":215},[921,1356,1359],{"alt":1357,"src":1358},"Примеры циклов for и while в bash-скрипте с кодом","/images/guides/linux/bash-scripting-basics/bash-loops-example.png",[20,1360,1361],{},[928,1362,1363],{},"Использование циклов для повторения задач в bash",[643,1365,1367],{"id":1366},"функции","Функции",[20,1369,1370],{},"Функции структурируют код и избегают дублирования.",[39,1372,1374],{"className":41,"code":1373,"language":43,"meta":44,"style":44},"#!/usr/bin/env bash\n\n# Определение\nprint_time() {\n    local message=$1\n    echo \"[$(date +%H:%M:%S)] $message\"\n}\n\n# Вызов\nprint_time \"Скрипт начался\"\n# ... ваш код ...\nprint_time \"Скрипт завершён\"\n",[34,1375,1376,1380,1384,1389,1397,1411,1429,1434,1438,1443,1451,1457],{"__ignoreMap":44},[48,1377,1378],{"class":50,"line":51},[48,1379,667],{"class":241},[48,1381,1382],{"class":50,"line":65},[48,1383,1200],{"emptyLinePlaceholder":468},[48,1385,1386],{"class":50,"line":259},[48,1387,1388],{"class":241},"# Определение\n",[48,1390,1391,1394],{"class":50,"line":265},[48,1392,1393],{"class":54},"print_time",[48,1395,1396],{"class":104},"() {\n",[48,1398,1399,1402,1405,1407],{"class":50,"line":274},[48,1400,1401],{"class":215},"    local",[48,1403,1404],{"class":104}," message",[48,1406,743],{"class":215},[48,1408,1410],{"class":1409},"s4XuR","$1\n",[48,1412,1413,1415,1418,1421,1424,1427],{"class":50,"line":280},[48,1414,876],{"class":160},[48,1416,1417],{"class":58}," \"[$(",[48,1419,1420],{"class":54},"date",[48,1422,1423],{"class":58}," +%H:%M:%S)] ",[48,1425,1426],{"class":104},"$message",[48,1428,801],{"class":58},[48,1430,1431],{"class":50,"line":982},[48,1432,1433],{"class":104},"}\n",[48,1435,1436],{"class":50,"line":1224},[48,1437,1200],{"emptyLinePlaceholder":468},[48,1439,1440],{"class":50,"line":1237},[48,1441,1442],{"class":241},"# Вызов\n",[48,1444,1446,1448],{"class":50,"line":1445},10,[48,1447,1393],{"class":54},[48,1449,1450],{"class":58}," \"Скрипт начался\"\n",[48,1452,1454],{"class":50,"line":1453},11,[48,1455,1456],{"class":241},"# ... ваш код ...\n",[48,1458,1460,1462],{"class":50,"line":1459},12,[48,1461,1393],{"class":54},[48,1463,1464],{"class":58}," \"Скрипт завершён\"\n",[366,1466,1467,1473],{},[369,1468,1469,1472],{},[34,1470,1471],{},"local"," создаёт переменную, видимую только внутри функции.",[369,1474,1475,1476,1479,1480,1482,1483,388],{},"Функции возвращают статус через ",[34,1477,1478],{},"return"," (число 0-255) или вывод через ",[34,1481,331],{}," (строка). Для захвата вывода используйте ",[34,1484,1485],{},"result=$(function_name)",[643,1487,1489],{"id":1488},"проверка-и-отладка","Проверка и отладка",[20,1491,1492],{},"Перед использованием в продакшене протестируйте скрипт:",[1494,1495,1496,1499,1509,1520],"ol",{},[369,1497,1498],{},"Запускайте с разными аргументами, включая граничные случаи (пустые строки, несуществующие файлы).",[369,1500,553,1501,1504,1505,1508],{},[34,1502,1503],{},"set -x"," в начале скрипта или запуск ",[34,1506,1507],{},"bash -x script.sh"," для пошагового вывода выполненных команд.",[369,1510,1511,1512,1515,1516,1519],{},"Добавьте ",[34,1513,1514],{},"set -e"," для автоматического выхода при ошибке любой команды и ",[34,1517,1518],{},"set -u"," для ошибки при использовании неопределённой переменной.",[369,1521,1522,1523,388],{},"Проверяйте коды возврата команд: ",[34,1524,1525],{},"if ! command; then echo \"Ошибка\"; fi",[643,1527,1529],{"id":1528},"типичные-ошибки-и-решения","Типичные ошибки и решения",[366,1531,1532,1542,1556,1573,1581,1590],{},[369,1533,1534,1538,1539,388],{},[372,1535,1536],{},[34,1537,725],{},": файл не исполняем. Решение: ",[34,1540,1541],{},"chmod +x script.sh",[369,1543,1544,1549,1550,1552,1553,388],{},[372,1545,1546],{},[34,1547,1548],{},"No such file or directory"," при запуске: проблема в shebang. Используйте ",[34,1551,378],{}," вместо ",[34,1554,1555],{},"#!/bin/bash",[369,1557,1558,1561,1562,1565,1566,1569,1570,388],{},[372,1559,1560],{},"Синтаксическая ошибка в условии",": проверьте пробелы в ",[34,1563,1564],{},"[ ]"," — они обязательны: ",[34,1567,1568],{},"[ \"$a\" = \"b\" ]",", а не ",[34,1571,1572],{},"[\"$a\"=\"b\"]",[369,1574,1575,1578,1579,388],{},[372,1576,1577],{},"Пустые переменные в условиях",": всегда заключайте в кавычки: ",[34,1580,1127],{},[369,1582,1583,1586,1587,388],{},[372,1584,1585],{},"Потеря аргументов при вызове функции",": передавайте явно: ",[34,1588,1589],{},"my_func \"$@\"",[369,1591,1592,1595,1596,1598],{},[372,1593,1594],{},"Неверный подсчёт аргументов",": ",[34,1597,826],{}," считает аргументы после обработки оболочкой. Если передаётся строка с пробелами в кавычках, это один аргумент.",[643,1600,1602],{"id":1601},"дальнейшие-шаги","Дальнейшие шаги",[20,1604,1605],{},"Освоив основы, изучите:",[366,1607,1608,1620,1626,1642,1645],{},[369,1609,1610,1611,353,1614,353,1617,388],{},"Обработку текста через ",[34,1612,1613],{},"grep",[34,1615,1616],{},"awk",[34,1618,1619],{},"sed",[369,1621,1622,1623,388],{},"Планирование задач через ",[34,1624,1625],{},"cron",[369,1627,1628,1629,353,1632,353,1635,353,1638,1641],{},"Работу с потоками ввода-вывода (",[34,1630,1631],{},"\u003C",[34,1633,1634],{},">",[34,1636,1637],{},">>",[34,1639,1640],{},"|",").",[369,1643,1644],{},"Массивы и ассоциативные массивы в bash.",[369,1646,1647,1648,1651],{},"Отладку через ",[34,1649,1650],{},"trap"," и сигналы.",[20,1653,1654],{},"Эти инструменты расширят возможности ваших скриптов для сложных задач администрирования.",[415,1656,1657],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":44,"searchDepth":65,"depth":65,"links":1659},[1660,1661,1662,1663,1664,1665,1666,1667],{"id":645,"depth":259,"text":646},{"id":736,"depth":259,"text":737},{"id":933,"depth":259,"text":934},{"id":1131,"depth":259,"text":1132},{"id":1366,"depth":259,"text":1367},{"id":1488,"depth":259,"text":1489},{"id":1528,"depth":259,"text":1529},{"id":1601,"depth":259,"text":1602},"2026-04-04 20:14:56","Научитесь писать bash-скрипты с нуля. Создавайте, запускайте и отлаживайте скрипты для автоматизации задач в Linux. Практические примеры переменных, условий и циклов внутри.","20 мин",[1672,1675,1678,1681],{"answer":1673,"question":1674},"`#!/usr/bin/env bash` — более переносимый вариант, он ищет bash в переменной PATH. `#!/bin/bash` жёстко задаёт абсолютный путь, что может не сработать на других системах.","Какой shebang выбрать: #!/bin/bash или #!/usr/bin/env bash?",{"answer":1676,"question":1677},"Используйте `set -e` для выхода при ошибке любой команды и `set -u` для ошибки при использовании неопределённой переменной. Ловите ошибки через `trap 'обработчик' ERR`.","Как правильно обрабатывать ошибки в bash-скрипте?",{"answer":1679,"question":1680},"`[[ ]]` — расширенный тест bash, он безопаснее (не требует экранирования `\u003C`, `>`), поддерживает `&&`, `||` и шаблоны (`== pattern`). Используйте `[[ ]]` в современных скриптах.","Чем отличается `[ ]` от `[[ ]]` в условиях?",{"answer":1682,"question":1683},"Используйте `\"$@\"` для передачи всех аргументов как отдельных слов или `\"$*\"` для одной строки. Для файлов можно вызвать скрипт как `./script.sh *.txt`.","Как передать в скрипт все файлы из текущей директории?",[1685,1688,1691,1694,1697],{"name":1686,"text":1687},"Создайте файл скрипта","Создайте файл с расширением .sh, например `myscript.sh`, в нужной директории.",{"name":1689,"text":1690},"Добавьте shebang","В первую строку файла добавьте `#!/usr/bin/env bash` для указания интерпретатора.",{"name":1692,"text":1693},"Напишите команды","Добавьте команды bash, которые нужно выполнить. Начинайте с простого `echo` для теста.",{"name":1695,"text":1696},"Сделайте файл исполняемым","В терминале выполните `chmod +x myscript.sh` для установки прав на выполнение.",{"name":1698,"text":1699},"Запустите скрипт","Запустите скрипт из его директории командой `./myscript.sh` или `bash myscript.sh`.","PT20M",[1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,733],"bash скриптинг для начинающих","как писать bash скрипты","bash скрипт примеры","основы bash linux","запуск bash скрипта","bash scripting tutorial","учить bash скрипты","bash script example","linux bash скрипты","bash команды","bash permission denied",{},[1715,1716,1717],"/guides/linux/cron-jobs-basics","/guides/linux/awk-text-processing","/guides/linux/sed-basics",{"title":631,"description":1669},"guides/linux/bash-scripting-basics","Практическое руководство по основам bash-скриптинга. Вы освоите создание исполняемых скриптов, работу с переменными и аргументами, условные операторы, циклы и функции для автоматизации рутины в Linux.",[43,470,1722,1723,482,1724],"scripting","automation","terminal","dnn4uiuRJB7AJQZVImHhqGVua8iOgA3oJHhF6Lpu0Wo"]