Скомпилированная программа заменяется версией репо за одну ночь

find... -exec sh -c 'sh code' {} +

В оболочке bash/ksh запускает команду findв новом процессе, который запускает один или несколько вызовов команд sh. sh codeсможет влиять только на переменные вызова sh, который интерпретирует этот код (, кстати, shне предназначен для поддержки массивов ).

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

С bash4.4+,вы можете сделать это с помощью:

readarray -td '' F_ARR < <(find "$CDIR" ! -type d -mtime +7 -print0)

Если ваш findне поддерживает -print0, вы можете заменить его на -exec printf '%s\0' {} +.

(с более старыми версиями bash, см. , как вы можете это сделать в этом ответе на аналогичный вопрос).

Здесь вы также можете использовать оболочку zshи выполнить:

f_arr=($CDIR/**/*(NDm+7^/))

Отличие от вышеизложенного заключается в том, что:

  • список файлов отсортирован, вы можете добавить квалификатор oNglob, чтобы отключить сортировку
  • $CDIRсам по себе не будет включен, даже если ему больше 8 дней.
  • если $CDIRявляется символической ссылкой на каталог, zshвсе равно будет спускаться в него.

Поскольку вы отметили свой вопрос как bash, так и ksh, обратите внимание, что существуют разные реализации и варианты ksh (ksh88, ksh93, грядущий ksh2020 для (изначально )Дэвид Корн, pdksh и его производные, такие как OpenBSD shили mksh, к которым вы можете добавить режим эмуляции ksh )zsh.

Большинство функций bashисходят из ksh88и ksh93, некоторые — из zshи mksh. readarray— одна из немногих функций, встроенных в bashи не встречающихся больше нигде.

ksh93 добавил параметр -dк readв 1993 году, позже скопированный bash (2000 )zsh (2003 )и mksh (2011 ), но только bash, zsh, mksh и ksh2020 могут использовать его с пустым разделителем для обработки записей с разделителями NUL. Подстановка процесса была добавлена ​​в ksh86 (1986 ), но ни один из вариантов ksh на основе pdksh -не поддерживает ее, поэтому методы, упомянутые выше для старых версий bash, не будут работать ни в одной версии ksh. (кроме режима эмуляции ksh zsh ).

В оболочках на основе ksh88, ksh93 и pdksh -один из вариантов — опубликовать -обработку вывода find, чтобы он сгенерировал код оболочки, который может определить этот массив и оценить этот код с помощьюeval:

eval set -A F_ARR "$(
  LC_ALL=C find "$CDIR" ! -type d -exec awk -v q="'" -- '
    BEGIN {
      for (i = 1; i < ARGC; i++) {
        gsub(q, q "\\" q q, ARGV[i])
        printf " %s", q ARGV[i] q
      }
      exit
    }' {} +
)"

(здесь предполагается, что $CDIRне начинается с +или -. Если это возможно, с некоторыми реализациями kshвы можете использовать set -A F_ARR --. В любом случае, если он начинается с -, findподавится им ).

Такой же подход можно использовать для любого POSIX sh, заменив set -A F_ARRна set --, что затем заполнит один массив оболочек POSIX:"$@".

0
09.11.2020, 19:12
1 ответ

Запустите grep -i apt /var/log/syslogи проверьте наличие автоматического задания, которое обновляет вашу систему для вас. Если это существует, то это может объяснить, почему ваш собственный двоичный файл заменяется в подсистеме alternatives. Предположительно, вы хотите остановить это

update-alternatives --config editor 0<&-; echo
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path               Priority   Status
------------------------------------------------------------
* 0            /bin/nano           40        auto mode
  1            /bin/ed            -100       manual mode
  2            /bin/nano           40        manual mode
  3            /usr/bin/vim.nox    40        manual mode
  4            /usr/bin/vim.tiny   15        manual mode

Press <enter> to keep the current choice[*], or type selection number:

Если вы еще этого не сделали, установите собственный двоичный файл в набор конфигурации

update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 1

Однако, если вы повторно -запустите команду --config(выше ), вы увидите, что вы еще не переключились на свой собственный двоичный файл. Сделайте это, и альтернативная подсистема увидит выбор manualи перестанет изменять настройку под вами. Я думаю, что это, возможно, был шаг, который вы пропустили

update-alternatives --set editor /usr/local/bin/vim
0
18.03.2021, 22:51

Теги

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