$ (“/ usr / sbin / sysctl -n hw.memsize”) Nenhum arquivo ou diretório

0

macOS High Sierra, 10.13.3 (17D102)

  • Se eu correr no terminal sysctl -n hw.memsize funciona bem, recebo um número
  • Se eu executar which sysctl i recebo /usr/sbin/sysctl , o que parece correto

Como executar o mesmo comando a partir do script de shell? Procurando por solução cross-OS. Usando sh puro em todos os lugares.

Eu tentei:

#!/bin/sh
$("sysctl -n hw.memsize")
exit 1

1 Resultado : linha 2: sysctl -n hw.memsize: comando não encontrado

#!/bin/sh
$("/usr/sbin/sysctl -n hw.memsize")
exit 1

2 Resultado : linha 2: / usr / sbin / sysctl -n hw.memsize: Nenhum arquivo ou diretório desse tipo

#!/bin/sh
echo 'sysctl -n hw.memsize'
exit 1

3 Resultado : linha 2: 17179869184: comando não encontrado

Não tenho certeza do porque o comando não encontrou a saída correta.

#!/bin/sh
eval "sysctl -n hw.memsize"
exit 1

4 Resultado : o mesmo que correr no terminal: 17179869184 Mas eu quero evitar o eval.

Enquanto o quarto funciona como epxected, ele usa eval e eu tento evitá-lo. 3 parece quase correto e não tenho certeza porque 2º diz que não existe tal arquivo enquanto ele existir.

O arquivo de script sh tem um chmod + x.

    
por Lukas 24.03.2018 / 07:24

1 resposta

3

Literalmente, o mesmo comando dentro de um script deve ser exatamente o mesmo :

sysctl -n hw.memsize

Suas tentativas concentram-se mais na sintaxe $(…) e eu não sei por que a necessidade de $(…) em primeiro lugar. Se você precisar (por exemplo, vamos armazenar o resultado em uma variável), então deve ser como

memsize=$(sysctl -n hw.memsize)

sem aspas dentro do $(…) .

$("sysctl -n hw.memsize")

1 Result: line 2: sysctl -n hw.memsize: command not found

É por causa de citações. Seu shell trata a string inteira como uma única palavra, um único comando (executável) para ser executado; enquanto sua intenção é passar um comando e dois argumentos. Sem aspas você obteria command not found de qualquer maneira porque o shell tentaria avaliar (executado neste caso) o resultado do comando interno (é isso que o $(…) faz), por exemplo o resultado pode ser 17179869184 . Não há nenhum comando 17179869184 em seu sistema, está lá? Observe que command not found viria de um nível diferente do que quando você usa aspas.

$("/usr/sbin/sysctl -n hw.memsize")

2 Result: line 2: /usr/sbin/sysctl -n hw.memsize: No such file or directory

Basicamente o mesmo que acima. A mensagem de erro é diferente por causa de / no "comando", mas o mecanismo é o mesmo.

echo 'sysctl -n hw.memsize'

3 Result: line 2: 17179869184: command not found

Isso deve funcionar (mas é um código horrível). Tem certeza de que não foi apenas 'sysctl -n hw.memsize' sem echo ? Isso seria o mesmo que o caso "sem aspas" explicado em seu primeiro resultado.

    
por 24.03.2018 / 10:36