Referência à saída de comando anterior/conteúdo da tela do terminal na linha de comando atual

Referência à saída de comando anterior/conteúdo da tela do terminal na linha de comando atual

Muitas vezes preciso copiar uma linha de saída no Bash por completo:

$ 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 serviria. Idealmente, isso funcionaria em qualquer Bash, mas um atalho do tmux também funcionaria.

Observe que estou familiarizado com tmux e copiar e colar na tela (entrar no modo colar, mover para copiar, voltar, colar), mas espero algo que possa usar mais facilmente (@@N), pois parece que faço isso com frequência .

Responder1

A função Bash a seguir usará a saída obtida após executar o comando (ou seja, 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 delimitada por '\n'.

Uso: seleção_saída [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.

Responder2

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 | tacimprimi-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

informação relacionada