Нейросеть для написания скриптов: Bash, PowerShell и Python

Модель быстро пишет скрипты для рутины, но запускать их вслепую нельзя. Показываем, как ставить задачу, требовать безопасный режим dry-run и проверять результат до запуска.

5 мин · · разработка · автоматизация

Нейросеть для написания скриптов хороша там, где задача понятна, а вспоминать синтаксис лень: перенести файлы по правилу, переименовать пачку, собрать отчёт из логов, раскидать данные по папкам. Модель выдаёт рабочий черновик за минуты. Опасность в другом: скрипт, который что-то удаляет или перезаписывает, при ошибке в одной строке может испортить данные. Ниже: как ставить задачу, чтобы получить безопасный код, как требовать режим dry-run, какие примеры на Bash, PowerShell и Python получаются и как проверять результат до запуска.

Нейросеть для написания скриптов: как ставить задачу

Расплывчатое «напиши скрипт для очистки логов» даёт скрипт под воображаемые условия. Хороший запрос содержит шесть частей:

  1. Среда. ОС и версия оболочки: «macOS 14, bash 3.2» или «Windows PowerShell 5.1», «Python 3.11».
  2. Задача. Что на входе и что нужно на выходе, с примерами имён файлов.
  3. Границы. Какие папки можно трогать, какие нельзя.
  4. Безопасность. Режим dry-run по умолчанию, реальные действия только с явным флагом.
  5. Поведение при ошибке. Остановиться или пропустить, что писать в журнал.
  6. Формат ответа. Один файл, без пояснений внутри кода, а после кода список мест, где скрипт меняет данные.

Пример готового запроса:

bash
Напиши скрипт на Bash.
Среда: macOS 14 и Ubuntu 22.04.
Задача: в папке из первого аргумента найти файлы *.log старше N дней (N — второй аргумент,
по умолчанию 30) и перенести их в подпапку archive. Вложенные папки не трогать.
Ограничения: не использовать sudo, ничего не удалять, только переносить.
По умолчанию dry-run: печатать, что будет сделано. Реальный перенос только с флагом --apply.
Проверять аргументы, использовать set -euo pipefail, учитывать пробелы в именах файлов.
После кода перечисли команды, которые меняют файловую систему, и что может пойти не так.

Последняя строка принципиальна: она заставляет модель самой назвать опасные места, и вы сверяете её список с кодом.

Bash: скрипт с dry-run

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

bash
#!/usr/bin/env bash
## Переносит .log старше N дней в подпапку archive. По умолчанию только показывает, что сделает.
set -euo pipefail

usage() { echo "Использование: $0 ПАПКА [ДНЕЙ] [--apply]" >&2; exit 1; }

DIR="${1:-}"; [[ -n "$DIR" ]] || usage
DAYS="${2:-30}"
APPLY="${3:-}"

[[ -d "$DIR" ]] || { echo "Нет такой папки: $DIR" >&2; exit 1; }
[[ "$DAYS" =~ ^[0-9]+$ ]] || usage

count=0

Что здесь сделано правильно: -print0 и read -d '' выдерживают пробелы в именах, mv -- не путает имя файла с опцией, -maxdepth 1 не спускается во вложенные папки, а без флага --apply ничего не меняется. Запуск: ./cleanup.sh ~/logs 30, затем ./cleanup.sh ~/logs 30 --apply.

PowerShell: -WhatIf бесплатно

В PowerShell безопасный режим встроен: если скрипт объявлен с SupportsShouldProcess, он получает параметр -WhatIf, и вам не нужно писать dry-run самим.

bash
[CmdletBinding(SupportsShouldProcess)]
param(
    [Parameter(Mandatory)][string]$Path,
    [int]$Days = 30
)

if (-not (Test-Path -LiteralPath $Path -PathType Container)) {
    throw "Нет такой папки: $Path"
}

$limit = (Get-Date).AddDays(-$Days)
$archive = Join-Path $Path 'archive'

$old = Get-ChildItem -LiteralPath $Path -Filter '*.log' -File |

Сначала запустите .\cleanup.ps1 -Path D:\logs -WhatIf, потом без -WhatIf. Если в скрипте есть кириллица, а вы используете Windows PowerShell 5.1, сохраняйте файл в UTF-8 с BOM, иначе строки могут прочитаться неверно. Об особенностях кириллицы и API-запросов из PowerShell написано в статье PowerShell и Claude API.

Python: argparse и явный флаг

bash
import argparse
import shutil
import time
from pathlib import Path


def main() -> None:
    parser = argparse.ArgumentParser(description="Переносит .log старше N дней в archive/")
    parser.add_argument("folder", type=Path)
    parser.add_argument("--days", type=int, default=30)
    parser.add_argument("--apply", action="store_true", help="выполнить, без флага только показать")
    args = parser.parse_args()

    if not args.folder.is_dir():

Python удобнее Bash, когда логика растёт: разбор дат, JSON, таблицы. На каком бы языке нейросеть ни писала код, принцип одинаков: явный флаг для действия и список затронутых файлов в выводе.

Как проверять скрипт перед запуском

  1. Прочитайте и попросите объяснить. Попросите модель пояснить построчно, какие команды меняют данные. Расхождение между её объяснением и вашим чтением кода — повод остановиться.
  2. Статический анализ. Для Bash — shellcheck, для PowerShell — PSScriptAnalyzer, для Python — python -m py_compile и линтер вроде ruff. Они ловят пропущенные кавычки и опечатки. Эти инструменты ставятся отдельно, смотрите их документацию.
  3. Тест на копии. Создайте временную папку с десятком файлов, воспроизводящих ваш случай, включая имена с пробелами и кириллицей.
  4. Dry-run на настоящих данных. Прочитайте вывод. Если в списке есть то, чего там быть не должно, остановитесь.
  5. Первый реальный запуск на небольшой выборке. И убедитесь, что есть копия или снимок данных.
  6. Опасные приметы. Ищите в коде rm -rf, sudo, curl ... | bash, Remove-Item -Recurse -Force, chmod -R, find ... -delete, перенаправление > на существующий файл и неэкранированные переменные в путях. Увидели такое — требуйте от модели переписать без этого.

Если скрипт нужен прямо в проекте

Когда задача связана с репозиторием, удобнее агент в терминале: он видит структуру папок, сам создаёт файл, запускает его на тестовых данных и правит по ошибкам. Подключение описано в руководстве по Claude Code. Но оставьте подтверждение команд включённым: агент, запускающий свой же скрипт без вопросов, снимает с вас последнюю страховку. Для самостоятельных заготовок под запросы пригодится подборка промптов для программиста.

Если хотите получать черновики из своего кода, отправьте задачу в API и сохраните результат в файл, не запуская его автоматически:

bash
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://api.zukko.pro/v1",
    api_key=os.environ["ZUKKO_API_KEY"],
)

task = open("task.txt", encoding="utf-8").read()
r = client.chat.completions.create(
    model="claude-sonnet-5-5",
    max_tokens=2000,
    messages=[
        {"role": "system", "content": "Отвечай кодом одного файла, без markdown-ограждений и пояснений."},
        {"role": "user", "content": task},
    ],
)
open("draft_script.sh", "w", encoding="utf-8").write(r.choices[0].message.content)
print("Черновик сохранён в draft_script.sh. Прочитайте его перед запуском.")

Это противоположная задача статье Bash, curl и jq: там скрипт вызывает модель, здесь модель пишет скрипт.

Сколько это стоит

Цены на 18 октября 2026, за 1M токенов. Запрос с описанием задачи около 1 500 токенов, скрипт с пояснениями около 1 200 токенов.

  • claude-sonnet-5-5 (вход $0.4, выход $2): 1 500 × 0.4 / 1 000 000 + 1 200 × 2 / 1 000 000 = 0.0006 + 0.0024 = $0.003. Десять итераций правок, пусть каждая с 3 000 токенов входа: 10 × (3 000 × 0.4 + 1 200 × 2) / 1 000 000 = 10 × 0.0036 = $0.036.
  • deepseek-v4.1-flash ($0.013 / $0.038): 1 500 × 0.013 / 1 000 000 + 1 200 × 0.038 / 1 000 000 ≈ $0.00007 за запрос.

Скрипт стоит копейки. Цена ошибки в скрипте несопоставимо выше, поэтому не экономьте на проверке. Актуальные цены: GET https://api.zukko.pro/v1/models.

Частые вопросы

Какая модель лучше пишет скрипты?

Мы не утверждаем, что одна пишет лучше. Для коротких скриптов хватит недорогой модели, для сложной логики сравните две-три на одной задаче и проверьте результат тестами.

Можно ли запускать сгенерированный скрипт сразу?

Нет. Прочитайте, прогоните статический анализ, запустите в режиме dry-run и на копии данных. Это занимает минуты и спасает данные.

Как заставить модель не использовать опасные команды?

Запретите их явно в запросе: «без sudo, без rm, только перенос». Но это не заменяет проверки: модель может нарушить ограничение, поэтому ищите опасные команды в коде сами.

Как подключиться из России?

Для оплаты из России есть три способа: СБП, карты MasterCard и криптовалюта. Ключ создаётся в кабинете Zukko.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.