我的问题与此处的手表问题类似,但有所不同。我需要使用引号,这似乎被别名手表剥离了。
我想在自定义 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
。正如您在上一个示例中所做的那样。只是当您的别名扩展时,双引号不会被引用。外部引号只是在定义别名时引用它。当别名展开时,它们不会在命令行上起作用。所以,任何这些:
注意:您可以使用
set -x
并运行watch >/dev/null
来查看 shell 实际运行的命令,如果引号实际传递给watch
.告诉
watch
跳过 shell,直接运行命令。这样,单独的命令行参数保持独立。手册页: