Analisa a terceira entrada no resultado da declaração

0

Eu tenho isso:

cd 31 /Users/alexamil/WebstormProjects/oresoftware/botch/botch-shell-overrides.sh

a saída do estilo acima é dada por este comando:

declare -F my_bash_func

Como posso pegar apenas o nome do arquivo desse resultado? algo como:

file=$(declare -F my_bash_func | grab_3rd_entry)

Eu tenho que usar:

shopt -s extdebug
declare -F my_bash_func
shopt -u extdebug

mas isso não funciona no MacOS:

shopt -s extdebug
declare -pf my_bash_func
shopt -u extdebug

o último produz um erro estranho:

declare: my_bash_func: not found

mas usando declare -F pode encontrar a função, então não tenho certeza porque a opção -pf não funciona.

    
por Alexander Mills 02.05.2018 / 06:36

2 respostas

0

Você pode usar awk para isso:

file=$(declare -F my_bash_func | awk '{print $3}')

Ou use os bash built-ins, leia-os em uma matriz:

func_info=( $(declare -F my_bash_func) )
file=${func_info[2]}
line_number=${func_info[1]}

Mas tenha em atenção que declare -F my_bash_func output não é muito amigável para os analisadores ... Se o ficheiro que contém a função for originado de um caminho relativo, a saída extdebug imprimirá apenas um caminho relativo (mesmo que não esteja Além disso, se o caminho tiver espaços ou caracteres não imprimíveis, eles serão preservados na saída (portanto, "3º campo" talvez não esteja correto ...)

    
por 02.05.2018 / 07:41
0

Como é bash, você pode fazer:

< <(shopt -s extdebug; declare -F my_bash_func) IFS=' ' read -d '' _ _ fn
echo "$fn"

Isso redefinirá o valor do extdebug ao sair do subshell.
Isso funcionará com arquivos com espaços e newlines.

    
por 02.05.2018 / 07:53