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

Просто получите пакет отсюда и установите его с помощью

dpkg -i freeradius-mysql.deb

, затем перезагрузите сервер.

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

3 ответа

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

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

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

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
ответ дан 22 May 2018 в 16:57
  • 1
    Так эффективно, du становится $0, и поэтому он работает, однако df предполагается, что он будет с позиционными параметрами bash вправо? или sh -c уже разделяет их, когда встречается &&? – Sergiy Kolodyazhnyy 31 October 2017 в 06:24
  • 2
    @ СергийКолодажный -h будет $ 0. Да, раздел && разделяет их, это похоже на запуск bash -c du -h /etc/passwd && df -h непосредственно в оболочке (обратите внимание на отсутствие кавычек). – muru 31 October 2017 в 06:27
  • 3
    да, вы правы, в -c параметры смещены, капризность меня смутила – Sergiy Kolodyazhnyy 31 October 2017 в 06:30

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

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

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

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
ответ дан 18 July 2018 в 04:13

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

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

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

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
ответ дан 24 July 2018 в 18:02

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

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