Capturar y probar el comando de salida en ZSH
-
27-10-2019 - |
Pregunta
He intentado innumerables formas de obtener lo que quiero, pero nada parece funcionar. Siempre termino con algo como 2:not found
.
¡Quiero capturar la salida de un comando, y luego probar si es igual a "!", Como así:
function test() {
local testv=$(command) 2>/dev/null
if [ $(#testv) == "!" ]; then
echo "Exclamation mark!"
else
echo "No exclamation mark."
fi
}
¿Cómo debo reescribir el código anterior para evitar el error? test:2: = not found
?
Solución
Esto debería funcionar:
if [ $testv = '!' ]; then
Hubo varios problemas aquí:
$(...)
ejecuta un comando y sustituye su salida; Desea sustituir un valor variable, así que use$var
o${var}
.- No tengo idea de lo que el
#
estaba haciendo allí.${#var}
Obtendrá la longitud de $ VAR, pero eso no es lo que quieres aquí. - los
test
comando (que[
es sinónimo de) no entiende==
, así que usa=
(Si eres un programador C que se verá equivocado, pero esto es shell no c). - No creo que esto sea un problema en un script, sino para la entrada interactiva
"!"
No hace lo que esperas. solía'!'
Para asegurarse de que el signo de exclamación no pueda interpretarse como una opción de historial.
Alternativamente, podrías usar [[ ]]
en vez de [ ]
, ya que entiende ==
(y tiene una sintaxis algo más limpia en general):
if [[ $testv == '!' ]]; then
Por cierto, confío en la etiqueta que este script está ejecutando en ZSH; Si no, la sintaxis será un poco diferente (los shells básicos no tienen [[ ]]
, y cualquier otra cosa que no sea ZSH realizará un análisis no deseado en el valor de $ testv a menos que esté en quotas dobles). Si no está seguro (o quiere que sea portátil), aquí hay una versión que debería funcionar en cualquier shell que cumpla con POSIX:
if [ "$testv" = '!' ]; then
Otros consejos
Intenta con esto:
local testv=$(command 2>/dev/null)
ya que es la salida del comando que desea redirigir.
(No tengo idea de lo que quieres decir con $(#testv)
aunque.)