Watch-comando-alias-expansão E preciso usar aspas

2

Minhas perguntas são semelhantes à pergunta de observação aqui , mas com uma diferença. Eu preciso usar aspas, que parecem ser removidas por um relógio alias.

Eu quero executar o relógio em um comando de slurm custom squeue:

$alias squeue_personal='squeue -o "%.18i %.9P %.8j %.8u %.216t %.10M %.6D %R    %V   %S  %Z"'
$alias watch='watch '        

OBSERVAÇÃO: de acordo com a outra pergunta do relógio

Mas isso ainda não funciona. Porque o relógio com alias remove as citações:

Every 2.0s: squeue -o %.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z                                                                                            Fri Jul  6 12:06:57 2018

squeue: error: Unrecognized option: %.9P
Usage: squeue [-A account] [--clusters names] [-i seconds] [--job jobid]
              [-n name] [-o format] [-p partitions] [--qos qos]
              [--reservation reservation] [--sort fields] [--start]
              [--step step_id] [-t states] [-u user_name] [--usage]
              [-L licenses] [-w nodes] [-ahjlrsv]

Se eu não usar aliases, tudo está bem. por exemplo. os seguintes trabalhos:

$watch 'squeue  -o "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z"'

Tenho certeza de que a solução é uma pequena virada para a outra pergunta sobre o relógio mas eu não sei o quê.

    
por Daniel Marchand 06.07.2018 / 15:40

1 resposta

3

watch concatena seus argumentos de linha de comando, juntando-os com espaços e passa o resultado como uma string para sh -c . Portanto, watch ls -l "foo bar" se torna igual a watch ls -l foo bar e você tem um problema semelhante com squeue . Você tem duas escolhas:

  1. Adicione aspas explícitas para o shell que watch inicia. Como você realmente fez no último exemplo. É só que quando o seu alias se expande, as aspas duplas não são citadas. As aspas externas apenas citam o alias quando ele é definido. Eles não agem na linha de comando quando o alias é expandido.

    Então, qualquer um destes:

    watch squeue -o '"%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z"'
    
    watch squeue -o \"%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z\"
    
    alias watch='watch '
    alias sq='squeue -o \"%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z\"'
    watch sq
    
    alias sq=\''squeue -o "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z"'\'
    watch sq
    

    OBSERVAÇÃO: Você pode usar set -x e executar watch >/dev/null para ver o comando que o shell realmente executa, você verá lá se as aspas forem repassadas para watch .

  2. Diga watch para pular o shell e executar o comando diretamente. Dessa forma, os argumentos da linha de comando separados permanecem separados. Página do manual :

    -x, --exec
    Pass command to exec(2) instead of sh -c which reduces the need to use extra quoting to get the desired effect.

    watch -x squeue -o "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R    %V   %S  %Z"
    
    alias watchx='watch -x '
    alias sq='squeue -o "%.18i %.9P %.8j %.8u %.216t %.10M %.6D %R    %V   %S  %Z"'
    watchx sq
    
por 06.07.2018 / 17:22

Tags