![watch-command-alias-expansion 并且需要使用引号](https://linux22.com/image/136421/watch-command-alias-expansion%20%E5%B9%B6%E4%B8%94%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%E5%BC%95%E5%8F%B7.png)
我的问题类似于在这里观看问题但有一个转折。我需要使用引号,它似乎被别名手表剥夺了。
我想在自定义 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"'
我确信解决方案是一些小改动另一个手表问题但我不知道是什么。
答案1
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
.告诉
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