O comando type não pode distinguir entre um comando executável e um shell script

3

Então eu estava lendo o livro A linha de comando do Linux , e ele diz que os comandos são de quatro tipos:

(1) executable programs

(2) shell builtins

(3) shell functions (shell scripts)

(4) aliases

Em seguida, ele diz que, para identificar o tipo de comando, você pode usar o comando type .

No entanto, notei que o comando type falha em distinguir entre uma função shell (shell script) e um comando executável.

Por exemplo:

type cp
(will output: cp is /bin/cp)

type bzexe
(will output: bzexe is /bin/bzexe)

No entanto, todos sabemos que cp é um programa executável e bzexe é um script de shell.

Então, minha pergunta agora é: que comando podemos usar para diferenciar os dois?

Eu sei sobre o comando file e funciona bem. Essa é a única solução?

    
por alkabary 26.12.2015 / 19:28

2 respostas

20

Um script de shell é um programa executável. É por isso que type diz que é um. Um shell script é tanto um comando executável quanto um script perl, um script python, um executável ELF nativo, um executável entre arquiteturas sendo executado pelo Qemu através do Linux binfmt_misc mecanismo, etc. Qualquer arquivo executável é um comando executável, não importa qual intérprete ele usa.

Como você pode ver na minha lista de exemplos, a linha entre "um script" e "não um script" é confusa: qualquer arquivo executável que comece com um shebang é um script, mas existem arquivos executáveis que não são código nativo nem scripts.

Quando você executa um programa, qual idioma está escrito é irrelevante. Portanto, não faria sentido que type falasse sobre isso. O trabalho de type é apenas dizer qual tipo de comando é do ponto de vista do shell.

Um script de shell não é a mesma coisa que uma função. Uma função é executada dentro do shell e pode modificar o ambiente do shell. Um script de shell é um programa separado; este programa separado pode ser escrito no mesmo idioma que o programa que você está executando agora, mas isso é apenas uma coincidência.

    
por 27.12.2015 / 00:20
6

O comando que você está querendo é file .

type /bin/bash
/bin/bash is /bin/bash

file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, stripped

type /bin/zcat
/bin/zcat is /bin/zcat

file /bin/zcat
/bin/zcat: POSIX shell script, ASCII text executable

EDIT: Desculpe, acabei de ler a última linha do seu post. file não é a única opção, mas é provavelmente a melhor. Você também pode usar algo como head para ver se o arquivo é simples ou binário, mas isso vai ficar um pouco confuso:)

    
por 26.12.2015 / 20:52