Watch

watch-command-alias-expansion 並且需要使用引號

  • July 6, 2018

我的問題與此處的手錶問題類似,但有所不同。我需要使用引號,這似乎被別名手錶剝離了。

我想在自定義 slurm squeue 命令上執行 watch:

$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"'

我確信解決方案是對另一個手錶問題的一些小轉折,但我不知道是什麼。

watch連接其命令行參數,用空格連接它們並將結果作為字元串傳遞給sh -c. 所以watch ls -l "foo bar"變得與 相同watch ls -l foo bar,並且您會遇到類似的問題squeue。你有兩個選擇:

  1. 為啟動的 shell 添加顯式引號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來查看 shell 實際執行的命令,如果引號實際傳遞給watch. 2. 告訴watch跳過 shell,直接執行命令。這樣,單獨的命令行參數保持獨立。手冊頁

-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

引用自:https://unix.stackexchange.com/questions/453858