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.