Comando que sai com status zero (não / bin / true)?

11

Eu tenho um Makefile que executa uma ferramenta que demora um pouco; permite-me substituir o comando usado:

make TOOL=alternative-tool

Gostaria de pular essa etapa no Makefile, por isso estou procurando um comando que saia com o status 0 e que tenha efeitos colaterais desprezíveis.

Obviamente, eu poderia usar true, mas isso é meio confuso:

make TOOL=true

Parece que eu quero executar a ferramenta, mas não quero.

Existe um executável instalado por padrão que não /bin/truesaia com o status 0 e que tenha um nome atraente e fácil de digitar?

Roger Lipscombe
fonte
Os makefiles suportam comentários, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Coloque um comentário antes da linha e documente seu código. Isso reduz a confusão e explica por que você usou uma certa abordagem.
21418 Freiheit
1
Qual linha? Ele TOOL=trueestará na linha de comando ao chamar make, provavelmente documentado em um README nas proximidades. A linha real que chama a ferramenta está em algum lugar dentro de um makefile de 7000 linhas (de terceiros).
22618 Roger Lipscombe

Respostas:

42

Mesmo que você tenha solicitado algo que "não seja /bin/true", substituir truepelo nome completo /bin/truepara mostrar que é o trueprograma e não algum outro significado de "verdadeiro" é provavelmente a melhor solução.

Sua preocupação é que o trueno

make TOOL=true

parece ser algo diferente de um nome de comando. Mas se você escrever

make TOOL=/bin/true

então isso é inequivocamente um comando. Alguém pode interpretar mal o TOOL=truesignificado de alguma outra ferramenta em algum lugar, mas não TOOL=/bin/trueé provável que tal interpretação seja incorreta .


Não tenho certeza de quando :, que é um shell embutido, mas não um comando externo, funcionará. Henning Makholm tem relatado que parece trabalho . Mas acho que não funciona em todas as situações e você descobriu que não funcionou para você .

Quanto a um alias de shell, você não pode usá-lo porque a expansão de alias não é executada nos argumentos passados ​​para um comando, nem os makefiles fazem uso de aliases de shell definidos anteriormente. Mesmo se makeexecutar seus comandos em um novo shell, esse shell não terá o alias (e não o usaria mesmo se o tivesse, porque seria um shell não interativo, onde a expansão do alias não é ativada automaticamente).

Eliah Kagan
fonte
1
Usar :parece funcionar bem para mim. makesempre gera um shell para executar cada comando depois de fazer suas próprias substituições.
hmakholm deixou Monica em 19/04/19
@ HenningMakholm Obrigado, eu editei. Você pode postar uma resposta. Lok Lam Cheng havia comentado sobre a pergunta a sugerir :, mas deveria ser uma resposta (especialmente se correta) e esse comentário não explica por que alguém deveria esperar que ela funcionasse. Em um diretório com hello.ce sem makefile, onde make hellocompila hello.cpara hello, achei make CC=: hellocomportado de acordo com o que você está dizendo.
Elias Kagan
2
Infelizmente, para esse Makefile específico (ele usa erlang.mk ), o uso :não funciona. Ser explícito /bin/trueé provavelmente a melhor maneira de fazê-lo.
Roger Lipscombe
7

Embora eu concorde que usar o caminho completo para trueseria a melhor solução, gostaria de observar qual é, de longe, a maneira mais comum de evitar a execução real de comandos: colocar um echona frente dele. Então:

make TOOL=echo
muru
fonte
Eu acho que isso às vezes é útil quando é importante lembrar que alguém suprimiu qualquer ação TOOLque de outra forma faria. Sem -sou equivalente, makeemite informações redundantes, porque ambos makee o echocomando executado makeseparadamente emitem saída. Por exemplo, quando eu corro make CC=echo helloem um diretório que possui hello.ce sem makefile, recebo echo hello.c -o hellocomo a primeira linha de saída e hello.c -o hellocomo a segunda. Mas algumas compilações usam (ou o usuário pode adicionar) -se, em seguida, é útil. make -s CC=echo hellodá apenas hello.c -o hello.
Elias Kagan #
(que ainda pode ser útil se os comandos envolver expansões de shell, para que possa obter uma ideia mais clara do que está sendo executado, se estiver interessado)
Muru
5

Você sempre pode fazer seu próprio comando que não faz nada além de retornar um status de saída zero. Algumas opções:

  • um link simbólico nomeado adequadamente para /bin/true

  • um script de shell vazio

  • um programa C quase vazio:

    int main() {
        return 0;
    }
    
David Foerster
fonte
Um bom nome para esse programa seria noop ou no-op.
Arp
0

Crie um link simbólico no diretório de trabalho para / bin / true chamado algo como skip. Portanto...

skip -> /bin/true

Então a linha de produção pode ser ...

make TOOL=./skip
DocSalvager
fonte
-2

Aqui está uma maneira de fazer isso com um pouco mais de caracteres:

function T() { /bin/true; }

Depois de ter feito isso uma vez que você pode re-executá-lo apenas usando o nome T.

false; T; echo $?
Lee B
fonte
3
Você poderia explicar como essa função pode ser chamada a partir de um valor da variável Make (para ser útil na situação em questão)?
precisa