Команда часов с оболочкой, не распознающей имена файлов

При попытке watch bash -c 'du -h /etc/passwd && df -h' кажется, что путь к файлу был полностью проигнорирован, и вместо этого du -h пробежал текущий рабочий каталог. Тот же результат наблюдался, когда я работал watch bash -c 'stat /etc/passwd && df -h', и stat возвращенный с stat: missing operand ошибка. В отличие от этого, использование watch -e "command /path/to/file" или watch "command /path/to/file" работы без проблем.

Почему не делает watch bash -c 'du -h /etc/passwd && df -h' работа затем? Это watchпроблема или bashпроблема с разделением аргумента?

2
задан 31 October 2017 в 05:04

1 ответ

watch выполняет команды с аргументами путем передачи их sh -c, таким образом, то, что Вы заканчиваете тем, что выполнили:

sh -c 'bash -c du -h /etc/passwd && df -h'

Оболочка, которую Вы выполняете, удаляет первый слой кавычек, которые Вы применили. -h, /etc/passwd затем передаются как $0 и $1 колотить, таким образом, они эффективно проигнорированы. Выполните что-то как:

watch 'du -h /etc/passwd && df -h'
watch "bash -c 'du -h /etc/passwd && df -h'"

Проверить, с помощью strace:

strace -fe execve -o log watch bash -c 'du -h /etc/passwd && df -h'

И log содержит:

17132 execve("/usr/bin/watch", ["watch", "bash", "-c", "du -h /etc/passwd && df -h"], [/* 40 vars */]) = 0
17134 execve("/bin/sh", ["sh", "-c", "bash -c du -h /etc/passwd && df "...], [/* 42 vars */]) = 0
17135 execve("/bin/bash", ["bash", "-c", "du", "-h", "/etc/passwd"], [/* 42 vars */]) = 0
17135 execve("/usr/bin/du", ["du"], [/* 42 vars */]) = 0
17135 +++ exited with 0 +++
5
ответ дан 2 December 2019 в 01:54

Другие вопросы по тегам:

Похожие вопросы: