Watch
watch-command-alias-expansion 並且需要使用引號
我的問題與此處的手錶問題類似,但有所不同。我需要使用引號,這似乎被別名手錶剝離了。
我想在自定義 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
。你有兩個選擇:
- 為啟動的 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