watch-command-alias-expansionと引用符を使用する必要があります

watch-command-alias-expansionと引用符を使用する必要があります

私の問題は次のようになりますここで問題を確認してください。しかし、反転があります。引用符を使用する必要がありますが、別名ウォッチによって削除されたようです。

カスタムslurm squeueコマンドでウォッチを実行したいと思います。

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

メモ: 他の時計の質問によると

しかし、まだ動作しません。エイリアス監視は引用符を削除するため:

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]

エイリアスを使用しないと、すべてが正常です。たとえば、次のように動作します。

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

解決策は小さな変化であると確信しています別の視聴の質問しかし、私はそれが何であるかわかりません。

答え1

watchコマンドライン引数を連結してスペースで連結し、結果を文字列として渡しますsh -c。したがって、watch ls -l "foo bar"と同じにwatch ls -l foo barなり、同様の問題が発生しますsqueue。 2つのオプションがあります。

  1. 起動したシェルに明示的な引用符を追加しますwatch。前の例で実際にやったように。エイリアスが拡張されると、二重引用符は引用符で囲まれません。外部引用符は、エイリアスが定義されている場合にのみ引用します。エイリアスが拡張されると、コマンドラインには影響しません。

    したがって、次のいずれか:

    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
    

    メモ:使用set -xして実行すると、watch >/dev/nullシェルが実際に実行されるコマンドを確認でき、引用符が実際にwatch

  2. watchシェルをスキップしてコマンドを直接実行するように指示します。これにより、個々のコマンドラインパラメータが独立して保持されます。マニュアルページ:

    -x代わりに、必要な効果を得るために追加の参照を使用する必要性を減らすために--exec
    コマンドを渡します。exec(2)sh -c

    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
    

関連情報