Como usar meus aliases no meu crontab?

16

Eu tenho alguns comandos no meu .profileque eu quero chamar do meu crontab.

Por exemplo, se eu tiver,

alias notify-me="~/bin/notify.pl -u user1"
alias notify-team="~/bin/notify.pl -u user1 user2 user3 user4 ...."

Eu gostaria de invocar o alias

0 11 * * * notify-team

portanto, se a lista no meu .profilefor atualizada, não preciso atualizar o crontabtambém. No entanto, parece que não consigo usar aliases no meu crontab. Existe uma solução alternativa?

Tentei as sugestões aqui para configurar o ambiente (por exemplo, / bin / bash -lc e o script wrapper de script). Parece que isso funciona para scripts, mas não para aliases.

Alguma ideia?

Keith Bentrup
fonte
Obrigado, tudo pela informação útil. Algumas soluções possíveis aqui, incluindo a minha. Eu finalmente modifiquei a idéia original do artifex para algo mais útil para a minha situação. Chris forneceu as informações necessárias para fazer isso com scripts separados.
Keith Bentrup

Respostas:

10

Na página de manual sobre aliases:

Observe que os aliases não são expandidos por padrão no shell não interativo,
e pode ser ativado configurando as 'expand_aliases'
opção shell usando shopt.

Portanto, tente usar shopt -s expand_aliasesno início do seu script de fornecimento. Isso deve permitir que você use a sugestão da Warner.

Christopher Karel
fonte
Isso está ativado para mim no CentOS5 por padrão. Nota legal embora.
Warner
Provavelmente não em um script, no entanto. Tente criar um script de teste que produza shopt expand_aliases. Aposto que está fora. Está na minha caixa do RHEL 5.3.
49420 Christopher
Você acerta o prego na cabeça. 1
Warner
+1 Thx por apontar isso. Isso me leva a uma solução, mas ainda preciso criar outro arquivo. Eu esperava fazer isso sem isso.
perfil completo de Keith Bentrup
Keith, eu tive o mesmo problema, mas fazer o eval 'foo'crontab fez o truque.
Artem Russakovskii
6

bash -c com "fonte" deve funcionar:

0 11 * * * bash -c "source .profile && notify-team"

isso também pode funcionar. o período significa "fonte"

0 11 * * * . .profile && notify-team
Collin Anderson
fonte
3

Como Chris identificou, a opção de shell padrão para shells não interativos é não expandir aliases. Aqui está uma solução que eu encontrei para trabalhar.

Escreva um script, ative a opção shell e crie seus aliases. Esteja ciente de que .bashrcé originário na execução, e é por isso que deve ser originado novamente depois de ativar o expand_aliases.

Peço desculpas pela recomendação inicialmente incorreta. Isso foi mais obscuro do que eu esperava inicialmente.

Roteiro:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
Warner
fonte
Thx, mas eu já tentei isso. Você pode confirmar que funciona no seu sistema? Eu também tentei / bin / bash -lc source ~ / .profile; equipe de notificação e outras variações. Também prefiro não ter um script separado para cada alias. Isso anula o objetivo de evitar duplicação.
Keith Bentrup
Eu deveria ter incluído o erro do crontab: "comando não encontrado" em todas as variações que tentei.
Keith Bentrup
Editado com uma recomendação testada.
Warner
Thx para o exemplo atualizado. Acho que se você adicionar -l à sua primeira linha, poderá se livrar da sua terceira.
Keith Bentrup
Ah, boa chamada - o shell de login teria expand_aliases ativado.
213 Warner Warner
1

Gosto da ideia do artifex de pegar o alias do arquivo e depois reutilizá-lo, pois não consegui encontrar uma maneira de expandir / reutilizar aliases diretamente. (Outras soluções ainda exigem outro script.)

Então, eu escrevi essa função e coloquei no meu .profile:

grab-alias () { sed -n '/alias\s*'$1'\s*=/ {s/[^'\'']*.//;s/'\''\s*$//p}' /home/bentrupk/.profile; }

Pude usá-lo no meu crontab para vários aliases como este:

0 11 * * * /bin/bash -lc 'x=`grab-alias notify-team`; $x'
0 7 * * * /bin/bash -lc 'x=`grab-alias notify-me`; $x'

etc.

Sim, reutilização de código! Obrigado a todos.

Keith Bentrup
fonte
3
isso é puro mal.
Justin
Se eu pudesse usar o alias diretamente, usaria. Esse é o ponto da questão. Você pode propor outra solução, mas eu levarei essa solução para vários arquivos de 2 a 3 linhas que bagunçam um diretório - que é o que acontecerá se eu adicionar esquemas de notificação adicionais ou decidir reutilizar alguns dos meus outros aliases.
Keith Bentrup
1

Realmente, a coisa mais simples que você poderia fazer seria criar

~ / bin / notifique-me com

#!/bin/sh
~/bin/notify.pl -u user1

~ / bin / equipe de notificação com

#!/bin/sh
~/bin/notify.pl -u user1 user2 user3 user4 ....

os aliases de shell são complicados de manter e integrar em outros sistemas, como você viu. a melhor coisa a fazer é transformá-los em comandos completos que não terão problemas engraçados no ambiente.

Justin
fonte
11
Obrigado pela sugestão, mas nunca pensei que fosse difícil manter aliases, e prefiro manter 1 arquivo de aliases do que manter muitos arquivos de wrapper. O problema estava executando os aliases em um trabalho cron.
Keith Bentrup
0

bash -ic "notify-team" é a melhor opção. Torna o alias disponível no crontab. Você também pode adicionar um & for background, pois estamos usando um shell 'interativo' com -i, mas na realidade não estamos interagindo com ele.

SuperGeek
fonte
-2
0 11 * * * bash -ic "notify-team" > /log/file

funciona para mim

vakhrymchuk
fonte
11
Alguma explicação iria melhorar a resposta
Dave M