Consulte o conteúdo da tela de saída / terminal do comando anterior na linha de comando atual

5

Muitas vezes preciso copiar uma linha de saída no Bash na íntegra:

$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim httpdocs/includes/config.php

Existe alguma maneira de configurar um atalho Bash ou Tmux para three lines up , como talvez @@3 :

$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim @@3 # This would be the equivalent of vim httpdocs/includes/config.php (three lines up)

O atalho não precisa ser @@ , qualquer outra coisa faria. O ideal seria que isso funcionasse em qualquer Bash, mas um atalho do tmux também funcionaria.

Note que estou familiarizado com o tmux e o copy e paste da tela (entre no modo de colar, movo para copiar, voltar, cole), mas estou esperando algo que eu possa usar com mais facilidade (@@ N) faça isso com frequência.

    
por dotancohen 14.04.2013 / 11:30

2 respostas

1

A função Bash a seguir usará a saída obtida após a execução do comando (por exemplo, grep -ilr mysql_connect * ) para criar uma lista da qual você pode selecionar uma opção, um arquivo. Após a seleção ser feita, o arquivo será aberto usando o Vim.

output_selection()
{
    local i=-1;
    local opts=()
    local s=

    while read -r line; do
        opts+=("$line")
        printf "[$((++i))] %s\n" "$line"
    done < <("$@")

    read -p '#?' s

    if [[ $s = *[!0-9]* ]]; then
        printf '%s\n' "'$s' is not numeric." >&2

    elif (( s < 0 )) || (( s >= ${#opts[@]} )); then
        printf '%s\n' "'$s' is out of bounds." >&2

    else
        vim "${opts[$s]}"
    fi
}

Pré-condições: A saída deve ser '\ n' delimitada.

Uso:     output_selection [comando]

Exemplo:

output_selection grep '.php$' foo.txt

Isso não é exatamente o que você pediu, então você pode ver isso como uma sugestão legítima para executar a mesma tarefa de uma maneira que seja, IMO, mais conveniente - especialmente quando a saída é grande.

    
por 15.04.2013 / 01:36
1

Supondo que os nomes dos arquivos não contenham espaços, isso fará o que você pediu:

$ set -- $(grep -ilr mysql_connect * | tac)
$ echo $3
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $1
statistics/logs/error_log

Você pode criar outra função sem | tac para imprimi-la na ordem correta:

$ set -- $(grep -ilr mysql_connect *)
$ echo $1
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $3
statistics/logs/error_log
    
por 14.04.2013 / 17:45

Tags