49 lines
2.5 KiB
Markdown
49 lines
2.5 KiB
Markdown
|
## Домашнее задание №8 «Утилита envdir»
|
|||
|
|
|||
|
Необходимо реализовать утилиту `envdir` на Go.
|
|||
|
|
|||
|
Эта утилита позволяет запускать программы, получая переменные окружения из определенной директории:
|
|||
|
- если директория содержит файл с именем `S`, первой строкой которого является `T`, то
|
|||
|
`envdir` удаляет переменную среды с именем `S`, если таковая существует, а затем добавляет
|
|||
|
переменную среды с именем `S` и значением `T`;
|
|||
|
- имя `S` не должно содержать `=`; пробелы и табуляция в конце `T` удаляются; терминальные нули (`0x00`) заменяются на перевод строки (`\n`);
|
|||
|
- если файл полностью пустой (длина - 0 байт), то `envdir` удаляет переменную окружения с именем `S`.
|
|||
|
|
|||
|
---
|
|||
|
Пример использования:
|
|||
|
```bash
|
|||
|
$ go-envdir /path/to/env/dir command arg1 arg2
|
|||
|
```
|
|||
|
Если в директории `/path/to/env/dir` содержатся файлы:
|
|||
|
* `FOO` с содержимым `123`;
|
|||
|
* `BAR` с содержимым `value`,
|
|||
|
|
|||
|
то вызов выше эквивалентен вызову
|
|||
|
```bash
|
|||
|
$ FOO=123 BAR=value command arg1 arg2
|
|||
|
```
|
|||
|
---
|
|||
|
|
|||
|
Также необходимо, чтобы:
|
|||
|
* стандартные потоки ввода/вывода/ошибок пробрасывались в вызываемую программу;
|
|||
|
* код выхода утилиты совпадал с кодом выхода программы.
|
|||
|
|
|||
|
При необходимости можно выделять дополнительные функции / ошибки.
|
|||
|
|
|||
|
Юнит-тесты могут использовать файлы из `testdata` или создавать свои директории / файлы,
|
|||
|
которые **обязаны** подчищать после своего выполнения.
|
|||
|
|
|||
|
### Критерии оценки
|
|||
|
- Пайплайн зелёный - 4 балла
|
|||
|
- Добавлены юнит-тесты - до 4 баллов
|
|||
|
- Понятность и чистота кода - до 2 баллов
|
|||
|
|
|||
|
#### Зачёт от 7 баллов
|
|||
|
|
|||
|
### Подсказки
|
|||
|
- https://www.unix.com/man-page/debian/8/envdir/
|
|||
|
- `os.Args`
|
|||
|
- `ioutil.ReadDir`
|
|||
|
- `bytes.Replace`, `strings.TrimRight`
|
|||
|
- `exec.Command`
|