watch-command-alias-expansion 및 따옴표를 사용해야 함

watch-command-alias-expansion 및 따옴표를 사용해야 함

내 문제는 다음과 비슷합니다여기에서 문제를 확인하세요.하지만 반전이 있습니다. 따옴표를 사용해야 하는데 별칭 watch에 의해 제거된 것 같습니다.

사용자 정의 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. 두 가지 옵션이 있습니다:

  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
    

관련 정보