Não é possível usar! $ em script?

11

Estou apenas imaginando por que isso não está funcionando

#!/bin/bash 

ls /bin
ls !$

Espero executar ls /bin duas vezes, mas o segundo gera erros, pois !$ não foi interpretado

Eu perdi algo, ou !$ só funciona na linha de comando?

Não consegui encontrar uma parte relevante em man bash (no mac)

    
por daisy 05.02.2016 / 17:25

2 respostas

26

Histórico e history expansion são desativados por padrão quando o shell é executado de forma não interativa.

Você precisa:

#!/bin/bash 

set -o history
set -o histexpand

ls /bin
ls !$

ou:

SHELLOPTS=history:histexpand bash script.sh

afetará todas as instâncias do bash que script.sh pode executar.

    
por 05.02.2016 / 17:36
7

A coisa sensata a fazer seria

ls /bin
ls $_

ou

set ls /bin
$*
$*

ou

c='ls /bin'
$c
$c

Advertências: vale lembrar que cada uma delas vem com algumas armadilhas. A solução $ _ captura apenas o último argumento: assim, ls foo bar deixará $ _ contendo apenas bar . Aquele usando set irá substituir os argumentos ( $1 , $2 , etc). E tudo isso como está escrito funcionará, mas quando generalizado para comandos mais complexos (onde a fuga e o espaço em branco importam), você poderá ter algumas dificuldades. Por exemplo: ls 'foo bar' (onde o argumento de caminho único foo bar contém dois ou mais espaços, ou qualquer outro caractere de espaço em branco) não se comportará corretamente em nenhum desses exemplos. Escape apropriado (possivelmente combinado com um comando eval ), ou usando "$@" em vez de $* , pode ser necessário para contornar esses casos.

    
por 06.02.2016 / 04:16

Tags