Passar argumento ao script e, em seguida, redirecionar o script como entrada para o bsub

4

Atualmente, estou trabalhando com o sistema de submissão de trabalhos da plataforma LSF. Preciso enviar scripts de job, mas estou com um problema ao passar argumentos para o script de job.

O que eu preciso é o seguinte: o script do job é um script bash que aceita um argumento de linha de comando. Eu preciso passar o argumento para esse script, em seguida, redirecionar o script para ser usado como entrada para bsub. O problema é que o argumento não está sendo aplicado ao script.

Eu tentei: bsub < script.bsub 1

script.bsub é meu script e 1 é o argumento numérico. Essa abordagem não funciona. O 1 está sendo tratado como um argumento para o bsub.

Outra abordagem: bsub < "script.bsub 1" Essa abordagem faz com que o bsub trate toda a linha com aspas duplas como um nome de arquivo.

Existe uma maneira de aplicar um argumento de linha de comando a um script primeiro e, em seguida, redirecionar esse script com o argumento para outro programa como entrada? Se alguém tiver experiência com o bsub isso seria ainda melhor.

UPDATE E WORKAROUND:

Parece que aplicar um argumento de linha de comando a um arquivo bsub é um processo muito complicado. Eu tentei o método HEREDOC indicado abaixo, mas bsub agiu como se o nome do arquivo de script fosse um comando. Portanto, a maneira mais fácil de contornar esse problema é simplesmente não usar o redirecionamento de entrada.

Para passar um argumento para um script a ser executado no bsub, primeiro especifique todos os argumentos bsub na linha de comando em vez de no arquivo de script. Então, para executar o arquivo de script, use

"sh script.sh [arg]"

depois de todos os argumentos do bsub. Assim, a linha inteira será parecida com:

bsub -q [queue] -J "[name]" -W 00:10 [other bsub args] "sh script.sh [script args]"

Isso não responde à minha pergunta original, mas pelo menos com o bsub essa é a resolução mais simples para o meu problema.

    
por The_D0lph1n 14.07.2014 / 20:14

2 respostas

2

Parece que aplicar um argumento de linha de comando a um arquivo bsub é um processo muito complicado. Eu tentei o método HEREDOC indicado pelo mikeserv, mas o bsub agiu como se o nome do arquivo fosse um comando. Portanto, a maneira mais fácil de contornar esse problema é simplesmente não usar o redirecionamento de entrada.

Como minha pergunta especificamente envolveu o bsub para o Platform LSF, o seguinte é provavelmente a melhor maneira de resolver esse tipo de problema de argumento: Para passar um argumento para um script a ser executado em bsub, primeiro especifique todos os argumentos bsub na linha de comando em vez de no arquivo de script. Então, para executar o arquivo de script, use

"sh script.sh [arg]"

depois de todos os argumentos do bsub. Assim, a linha inteira será parecida com:

bsub -q [queue] -J "[name]" -W 00:10 [other bsub args] "sh script.sh [script args]"

Nesse caso, é melhor não usar os arquivos .bsub para o script e usar um script .sh normal e usar o comando Unix sh para executá-lo com argumentos.

    
por 15.07.2014 / 20:44
2

Você precisa de um documento aqui ou de uma string aqui.

bsub <<HEREDOC
    $(script.bsub 1)
HEREDOC

Isso é o que um documento aqui parece. O shell lerá a expansão de tudo entre a linha na qual <<HEREDOC ocorre até encontrar uma linha na qual nada além de HEREDOC ocorra e passe a saída para o comando chamado em seu descritor de arquivo 0 - stdin.

Uma string aqui é a mesma coisa em princípio:

bsub <<< script.bsub 1

Pode parecer mais simples de usar, mas também é mais fácil confundi-lo e não é script de shell portátil. Enquanto um documento aqui é definido como parte do padrão de shell POSIX, uma string here é uma implementação específica do shell - embora funcione no bash.

Provavelmente, é melhor usar um documento aqui em cada caso com script, a menos que você possa ter 100% de certeza de que o script nunca será executado em um ambiente no qual ele não seja violado e usar strings aqui apenas em interativos use como eles são pouco mais que um atalho em primeiro lugar.

Claro, se qualquer um deles funcionar, provavelmente:

script.bsub 1 | bsub

também funcionaria. Isso fará com que stdout do |pipe script.bsub seja em stdin do bsub , mas também é muito provável que execute bsub em um subshell. Se bsub modificar o ambiente atual do shell de alguma forma - como alterar o valor de uma variável do shell - de que depende, o |pipe pode não ser a melhor solução.

    
por 14.07.2014 / 21:25