Bash 함수에서 두 번째 매개변수를 전달하는 방법

Bash 함수에서 두 번째 매개변수를 전달하는 방법

먼저 원격 데스크톱에 연결한 다음 원격 데스크톱의 명령줄에 연결할 때 두 번째 인수를 사용하고 싶다고 가정해 보겠습니다 bash function. 이것이 바로 작은따옴표를 사용하는 이유입니다. 그러나 이 문제를 어떻게 이해해야 할지 모르겠습니다. $2논쟁.

my_func () {
ssh blah blah blah $1 'cd $2'
}

두 번째 매개변수를 어떻게 지정해야 할지 잘 모르겠습니다. 내 로컬 컴퓨터에서 이 기능을 실행해 보았습니다. my_func a b여기서 b는 원격 데스크톱의 디렉터리이지만 예상한 결과를 얻지 못하는 것 같습니다.

답변1

$2원격 사용자의 로그인 셸에 적합한 방식으로 인용 해야 합니다 . 예를 들어 Bourne과 유사하다고 가정해 보겠습니다.

shquote() {
  LC_ALL=C awk -v q=\' '
    BEGIN{
      for (i=1; i<ARGC; i++) {
        gsub(q, q "\\" q q, ARGV[i])
        printf "%s ", q ARGV[i] q
      }
      print ""
    }' "$@"
}

my_func () {
  ssh blah blah blah "$1" "cd -- $(shquote "$2")"
}

예를 들어, 이는 Bourne과 유사한 원격 셸에서 디렉터리 인수를 사용 하여 실행되는 것으로 해석되는 명령줄 로 shquote()변환됩니다 .Stephane's dir'Stephane'\''s dir'cd -- 'Stephane'\''s dir'cdStephane's dir

그럼에도 불구하고 원격 호스트에서 쉘을 실행해도 cd유용한 결과가 생성되지 않습니다.

추가 읽기(및 원격 사용자의 로그인 셸이 Bourne의 로그인 셸과 다른 경우를 포함한 추가 옵션):원격 사용자의 로그인 셸을 모르고 SSH를 통해 임의의 간단한 명령을 어떻게 실행할 수 있습니까?

답변2

my_func () {
ssh blah blah blah $1 'cd $2'
}

작은따옴표를 사용하지 마세요. Bash 변수는 작은따옴표를 사용할 때 확장되지 않습니다. 시도해 보면 ssh blah blah blah $1 "cd $2"제대로 작동할 것입니다. 작은따옴표를 큰따옴표로 변경해도 bash가 명령의 다른 항목을 확장하지 않는지 확인하세요. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다.

답변3

무엇에 대해:

my_func() {
    blah blah blah blah $1 "cd \"$2\""
}

이는 포함된 매개변수에는 적용되지 않습니다 ".

관련 정보