-bash :/usr/bin/ls :Слишком длинный список аргументов

Поскольку правая часть вашего конвейера evtest | read lineвыполняется в отдельной подоболочке (и, следовательно, никогда не устанавливает lineна что-либо полезное ), я ожидал, что ваш тест будет никогда не будет правдой, и что сценарий будет выполняться бесконечно. Может у вас в скрипте есть код, который вы не показываете?

В любом случае вам не нужно readиз evtest. Вместо этого вы можете использовать grep(, это также позаботится о «потенциальной проблеме», которую вы упомянули в конце ):

.
#!/bin/sh

exitCase='*type 1 (EV_KEY), code 57 (KEY_SPACE)*'

while true; do
    if evtest /dev/input/eventX | grep -q -Fx -e "$exitCase"; then
        echo caught event
        break
    else           
        echo loop doing stuff
    fi
done

Это прервет цикл, как только evtestсоздаст строку, точно такую ​​же, как $exitCase. Параметр -qдля grepговорит, что он должен быть тихим (нас интересует только статус выхода ), с помощью -Fмы убеждаемся, что grepсравнивает строку $exitCaseкак строка , а не как регулярное выражение, а с -xмы требуем, чтобы вся строка соответствовала (без подстрок, как если бы строка была привязана как в начале, так и в конце ).

Если вы хотите установить тайм-аут для grepили evtest, вы можете использовать timeoutиз GNU coreutils.

-1
02.11.2021, 02:39
2 ответа

Используйте xargs --show-limits </dev/null, чтобы увидеть свои текущие лимиты.

Лучший способ:

find repo -maxdepth 1 -type f -name '*' -print0 | \
  xargs -0 --no-run-if-empty  \
    cp --target-directory=./backup_repro/

Не рекомендуется располагать каталог резервных копий в том же каталоге, что и файлы, для которых выполняется резервное копирование. Это может привести к резервному копированию резервной копии, содержащей резервную копию, содержащую... и размер резервной копии приближается к бесконечности.

Считайте man find xargs cp.

0
02.11.2021, 03:46

Если вы просто хотите сделать копию repoв backup_repo, используйтеrsync:

rsync -a repo/ backup_repo

Или, если вам нужна только резервная копия, сделайте tarархив,

tar -c -f repo.tar repo

Если вы хотите скопировать только видимые имена, которые *раскрываются внутри repo, и пропустить любые скрытые имена (, такие как .git), вы можете использовать

printf '%s\0' repo/* | xargs -0 -I {} cp -R -- {} backup_repo

или, если предположить, что GNU cp,

printf '%s\0' repo/* | xargs -0 cp -t backup_repo -R --

Утилита printfвстроена в оболочку bashи поэтому не будет иметь такого же ограничения на размер списка аргументов, как у внешней утилиты, такой как ls.

0
02.11.2021, 07:46

Теги

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