shell — правило для GitHub Copilot: безопасные bash-скрипты
Правило, которое заставляет GitHub Copilot писать чистые и безопасные shell-скрипты. Применяется к файлам *.sh автоматически.
.github/instructions/shell.instructions.mdЧто делает shell
Правило содержит конвенции для bash, sh и zsh: set -euo pipefail, двойные кавычки вокруг переменных, mktemp для временных файлов, trap для очистки. Copilot следует им при генерации кода в файлах *.sh.
Для работы с JSON и YAML правило требует jq и yq вместо grep и awk. Если этих инструментов нет, скрипт должен упасть с понятным сообщением — это заложено в инструкции.
Скрипты по этому правилу ориентированы на автоматизацию и тестирование, не на прод. Поэтому лишнее логирование не приветствуется, а вывод echo должен быть коротким.
Какие задачи решает
- заставить Copilot добавлять
set -euo pipefailв каждый скрипт - генерировать скрипты с безопасными раскрытиями переменных вместо
eval - парсить JSON и YAML через
jq/yq, а неgrep - создавать временные файлы через
mktempс автоочисткой - получать одинаковую структуру скриптов: shebang, header, функции, main
Примеры запросов агенту
- сгенерируй скрипт для бэкапа директории по правилу shell
- напиши bash-скрипт, который читает config.json и проверяет поля
- добавь обработку ошибок и очистку временных файлов в этот скрипт
Как установить shell
Вручную: положить файлы
.github/instructions/shell.instructions.mdПоле applyTo задаёт, к каким файлам применять
Вручную: положить файлы
.claude/rules/shell.mdПоле paths во frontmatter ограничивает файлы: applyTo из источника → paths
AGENTS.md
Codex читает AGENTS.md: вставьте текст правила туда
Вручную: положить файлы
.cursor/rules/shell.mdcВо frontmatter: description, globs, alwaysApply. applyTo из источника → globs, иначе правило само не подключится
Вручную: положить файлы
.devin/rules/shell.mdВручную: положить файлы
.clinerules/shell.mdПо шагам, с командами для каждой платформы: AGENTS.md и CLAUDE.md: что это, кто читает и какой выбрать
Из того же набора732
Весь набор →Похожие
Рядом в теме «Настройка агента: память, контекст, субагенты»
Все правила IDE по теме «Настройка агента: память, контекст, субагенты» →Вопросы о shell
Как установить правило shell в GitHub Copilot?
Создайте файл .github/instructions/shell.instructions.md в корне репозитория и вставьте туда содержимое правила. Copilot подхватит его для всех файлов *.sh.
Что делает правило shell?
Задаёт стандарты для генерации shell-скриптов: обязательные set -euo pipefail, безопасные подстановки, mktemp для временных файлов, jq/yq для структурированных данных.
Что нужно для работы правила?
В скриптах, которые парсят JSON или YAML, нужны jq и yq. Правило предписывает проверять их наличие и падать с понятной ошибкой, если инструментов нет.
Исходный текст
shell.instructions.md · MIT
---
description: 'Shell scripting best practices and conventions for bash, sh, zsh, and other shells'
applyTo: '**/*.sh'
---
# Shell Scripting Guidelines
Instructions for writing clean, safe, and maintainable shell scripts for bash, sh, zsh, and other shells.
## General Principles
- Generate code that is clean, simple, and concise
- Ensure scripts are easily readable and understandable
- Add comments where helpful for understanding how the script works
- Generate concise and simple echo outputs to provide execution status
- Avoid unnecessary echo output and excessive logging
- Use shellcheck for static analysis when available
- Assume scripts are for automation and testing rather than production systems unless specified otherwise
- Prefer safe expansions: double-quote variable references (`"$var"`), use `${var}` for clarity, and avoid `eval`
- Use modern Bash features (`[[ ]]`, `local`, arrays) when portability requirements allow; fall back to POSIX constructs only when needed
- Choose reliable parsers for structured data instead of ad-hoc text processing
## Error Handling & Safety
- Always enable `set -euo pipefail` to fail fast on errors, catch unset variables, and surface pipeline failures
- Validate all required parameters before execution
- Provide clear error messages with context
- Use `trap` to clean up temporary resources or handle unexpected exits when the script terminates
- Declare immutable values with `readonly` (or `declare -r`) to prevent accidental reassignment
- Use `mktemp` to create temporary files or directories safely and ensure they are removed in your cleanup handler
## Script Structure
- Start with a clear shebang: `#!/bin/bash` unless specified otherwise
- Include a header comment explaining the script's purpose
- Define default values for all variables at the top
- Use functions for reusable code blocks
- Create reusable functions instead of repeating similar blocks of code
- Keep the main execution flow clean and readable
## Working with JSON and YAML
- Prefer dedicated parsers (`jq` for JSON, `yq` for YAML—or `jq` on JSON converted via `yq`) over ad-hoc text processing with `grep`, `awk`, or shell string splitting
- When `jq`/`yq` are unavailable or not appropriate, choose the next most reliable parser available in your environment, and be explicit about how it should be used safely
- Validate that required fields exist and handle missing/invalid data paths explicitly (e.g., by checking `jq` exit status or using `// empty`)
- Quote jq/yq filters to prevent shell expansion and prefer `--raw-output` when you need plain strings
- Treat parser errors as fatal: combine with `set -euo pipefail` or test command success before using results
- Document parser dependencies at the top of the script and fail fast with a helpful message if `jq`/`yq` (or alternative tools) are required but not installed
```bash
#!/bin/bash
# ============================================================================
# Script Description Here
# ============================================================================
set -euo pipefail
cleanup() {
# Remove temporary resources or perform other teardown steps as needed
if [[ -n "${TEMP_DIR:-}" && -d "$TEMP_DIR" ]]; then
rm -rf "$TEMP_DIR"
fi
}
trap cleanup EXIT
# Default values
RESOURCE_GROUP=""
REQUIRED_PARAM=""
OPTIONAL_PARAM="default-value"
readonly SCRIPT_NAME="$(basename "$0")"
TEMP_DIR=""
# Functions
usage() {
echo "Usage: $SCRIPT_NAME [OPTIONS]"
echo "Options:"
echo " -g, --resource-group Resource group (required)"
echo " -h, --help Show this help"
exit 0
}
validate_requirements() {
if [[ -z "$RESOURCE_GROUP" ]]; then
echo "Error: Resource group is required"
exit 1
fi
}
main() {
validate_requirements
TEMP_DIR="$(mktemp -d)"
if [[ ! -d "$TEMP_DIR" ]]; then
echo "Error: failed to create temporary directory" >&2
exit 1
fi
echo "============================================================================"
echo "Script Execution Started"
echo "============================================================================"
# Main logic here
echo "============================================================================"
echo "Script Execution Completed"
echo "============================================================================"
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
-g|--resource-group)
RESOURCE_GROUP="$2"
shift 2
;;
-h|--help)
usage
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
# Execute main function
main "$@"
```
© github · MIT · github/awesome-copilot