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`
|