Наиболее вероятно различие в переменных среды и текущей рабочей папке. Служба
запускает скрипт из /
и с чистой средой. Таким образом, может потребоваться проверить среду и текущий рабочий каталог (с помощью команд export
, pwd
или set
) и добавить отсутствующие предварительные условия в сценарий.
Вы близки.
Во-первых, переменная M4
должна быть набором к пути к фактическому файлу программы M4, а не к каталогу, в котором она находится. Возможно, для этой переменной чаще, чем в вашем случае, используется выбор нескольких M4 программ, которые уже находятся в PATH
, поэтому необходимо назвать фактический исполняемый файл. Обычно в OSes типа BSD используется платформа m4
, а затем программа GNU M4, называемая, например, gm4
. При построении GNU Bison может потребоваться использовать GNU-версию M4, и эта переменная позволяет это сделать. В противном случае сценарий сначала найдет версию BSD в нашей примерной системе.
Во-вторых, я думаю, что ваше изменение PATH
игнорируется. Если не экспортировать
PATH
, новое значение будет доступно только оболочке. Это можно исправить двумя способами:
export PATH=$HOME/local/flex/bin/:$PATH
или
PATH=$HOME/local/flex/bin/:$PATH ../configure --flags-and-stuff-here
Вторая версия вносит изменения только для сценария configure
. Любые программы, запускающие скрипты, не увидят измененный PATH
, если он не экспортирует новое значение.
Лично я бы сделал это первым способом в одном из ваших сценариев запуска (например, ~/.bash _ profile
), потому что вы хотите, чтобы ваша личная версия Flex была доступна вам после установки Bison. Регистрация, затем вернитесь и попробуйте запустить flex
для тестирования. Если это работает, скрипт Bison configure
также должен сначала найти эту версию.
Эта проблема на самом деле может быть проще всего сделать с ed
, поскольку это в основном скриптовый текстовый редактор, а не потоковый процессор. Используя ed
, вы не должны сохранять все строки файла в массив, например, так как он уже делает это для вас.
# Create test file
~> printf "%s\n" aaaaaa bbbbbb cccccc dddddd eeeeee >test.txt
~> cat test.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
# Use ed to open the file, move the last line after the first, save, and quit
~> printf "%s\n" '$m1' wq | ed test.txt
35
35
~> cat test.txt
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
Вы можете использовать все за один раз. Также используйте +
вместо этого, что будет быстрее, так как выполнит все действие сразу.
find /tmp -type f -iname 'magick-*'-exec stat {} + -exec sh -c 'rm -rf $@' _ {} + | tee -a log_to_file
Вы не показываете, что происходит , когда вы пробуете его. Просто говоря: «Это не работает», никогда не правильно.
Я подозреваю, что ваши проблемы Mey будут связаны с одним или несколькими из следующих действий:
*
. Если вы этого не сделаете, и у вас есть один или несколько файлов в текущем каталоге, который соответствует этому шаблону, шаблон будет расширен в список сопоставленных файлов и заменяет в вашу команду, что это не хочу. / TMP / *
для поиска, просто используйте / TMP
, находятся
, идеально способны речь идут в данный каталог сам по себе; Затем он также найдет какие-либо файлы, имя которых начинается с точки. Кроме того, если бы работал RM
, то статус также должен работать
.
Обратите внимание также, что вы можете объединить два:
find /tmp -type f -iname 'magick-*' -exec stat {} \; -exec rm {} \;
сначала Stat
, то, если статус
не потерпел неудачу, RM
выполняется.
Вы можете сохранить вывод, просто перенаправляя Найти
вывод на любой файл, который вы хотите.