Как заставить команду 'сокращения' рассматривать несколько последовательных разделителей как один?
$ cat text.txt | tr -s " " " " | cut -d " " -f 4
Можно получить файл, который Вы хотите наверху сценария или начало задания для пользователя, который выполняет задание. "Исходная" команда является встроенным. Вы сделали бы то же самое при создании редактирований в те файлы для загрузки изменений.
* * * * * source /home/user/.bash_profile; <command>
или
#!/bin/bash
source /home/user/.bash_profile
<commands>
Поскольку это не интерактивная оболочка. То же происходит при открытии некоторых терминалов.
Взгляните на этот вопрос: Каков .bashrc файл? | Суперпользователь
И также в этом:
Каково различие между .bashrc, .bash_profile, и .environment? | Переполнение стека
Различные сценарии стреляют в зависимости от того, если соединение является оболочкой входа в систему (или не), интерактивная оболочка (или не), или оба.
Если Вы захотите сделать bashrc, то необходимо будет внести это изменение:
То, когда Bash запускается нев интерактивном режиме, для выполнения сценария оболочки, например, он ищет переменный BASH_ENV в среде, разворачивает ее значение, если это появляется там и использует расширенное значение в качестве названия файла, чтобы читать и выполниться. Bash ведет себя, как будто следующая команда выполнялась:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
но значение переменной ПУТИ не используется для поиска имени файла.
Как отмечено выше, если неинтерактивная оболочка вызывается с
--login
опция, Bash пытается считать и выполнить команды из файлов запуска оболочки входа в систему.
Вы не сможете запустить source
, если используется оболочка sh
. Это можно изменить, добавив следующую строку в ваш crontab:
SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>
Вы также можете указать среду:
BASH_ENV="/root/.bashrc"
* * * * * <command>
или вы можете использовать свой локальный /home/user/.bashrc
, если это пользователь задание cron (например, crontab -e
).
Обратите внимание, что .bash_profile
может заменить .bashrc
, если он существует.
У меня была такая же проблема при выполнении приложения узла из cron, использующего NVM. Чтобы заставить оболочку bash читать файл.bashrc из cron, просто вызовите команду bash с опцией интерактивной оболочки `-l.
например:* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Если это не сработает, попробуйте установить переменную пути в crontab
41 7 * * * /bin/bash -lc "PATH=$PATH:/home/user/.nvm/versions/node/v8.10.0/bin && /home/user/script.sh restart "
Вы можете вызвать bash с опцией -l
, вот так:
* * * * * /bin/bash -l /path/to/script arg1 arg2
Опция -l
делает bash оболочкой входа . Таким образом, он будет читать .bash_profile
пользователя. Он не будет читать .bashrc
пользователя, если только он не получен явным образом .bash_profile
. Это связано с тем, что не интерактивные оболочки -не считывают .bashrc
автоматически. Но вам не нужно .bashrc
для задания cron, потому что .bashrc
предназначен для установки вещей, полезных для интерактивной оболочки.
Вариации:
Если bash указан в PATH, указывать абсолютный путь не нужно:
* * * * * bash -l /path/to/script arg1 arg2
Оптимизация может состоять в том, чтобы заменить текущую оболочку с помощьюexec
:
* * * * * exec bash -l /path/to/script arg1 arg2
bash
оболочка. Я добавил ответ, который может обработать случай, когда оболочкаsh
. – Jonathan 03.05.2017, 10:40