su 명령을 통해 값에 $가 포함된 변수를 현재 사용자 및 다른 사용자로 사용하는 기능

su 명령을 통해 값에 $가 포함된 변수를 현재 사용자 및 다른 사용자로 사용하는 기능

변수 값이 $서명되었다고 가정합니다(Java 내부 클래스의 저장 경로).

현재 사용자와 다른 사용자 모두로 처리하고 싶습니다(현재 사용자를 가정하여 root명령을 사용할 때 비밀번호를 입력할 필요가 없습니다 su).

예:

path_value=/home/username/filename\$1.class

echo ${path_value}

su username -c "echo ${path_value}"

첫 번째 결과 echo:

/home/username/filename$1.class

echo두 번째 내부 명령의 결과 su:

/home/username/filename.class

두 곳에서 동일한 값으로 처리할 수 있도록 해당 변수를 사용하고 싶습니다.

답변1

환경을 통해 값을 내보내고 내부 셸에서 확장하도록 합니다. 가상의 username로그인 쉘은 Bourne과 유사합니다:

$ export path_value=/home/username/filename\$1.class
$ su username -c 'echo "$path_value"'
/home/username/filename$1.class

이는 변수에 따옴표가 포함된 경우에도 작동하지만 사용된 명령이 환경을 지우는 경우에는 작동하지 않습니다. 나는 그것이 su이루어져야 한다고 생각하지 않지만 sudo그렇게 될 수도 있습니다.

변수에 작은따옴표²를 포함할 수 없다는 것을 알고 있으면 내부 쉘에서 문자열을 작은따옴표로 확장할 수 있습니다.

$ path_value=/home/username/filename\$1.class
$ su username -c "echo '$path_value'"
/home/username/filename$1.class

(인용문의 순서는 반대이니 참고하세요.)


¹ username로그인 쉘이 cshor 인 경우 tcsh, or의 파생물 인 경우 echo "$path_value"로 바꾸십시오 . echo $path_value:qrcecho $path_value

csh사용자의 로그인 쉘이 또는 인 경우 ² 및 개행 문자를 포함하고, tcsh사용자의 로그인 쉘이 인 경우 유효한 문자를 형성하지 않는 바이트를 포함하지 않습니다 yash. 또한 -백슬래시로 시작하거나 포함하는 매개변수는 문제를 일으키며 임의의 데이터 echo와 함께 사용하는 것이 가장 좋습니다.printf '%s\n'

답변2

sudo대신 사용하지 않으시겠습니까 su?

# path_value=/home/username/filename\$1.class
# echo "${path_value}"
/home/username/filename$1.class
# sudo -u username echo "${path_value}"
/home/username/filename$1.class

답변3

두 번째 에코에 변수를 작은따옴표로 묶습니다. 예를 들면 다음과 같습니다.

su username -c "echo '${path_value}'"

이런 방식으로 echo는 변수의 내용을 문자열로 해석하고 "$" 기호는 이스케이프됩니다.

답변4

모든 확장명을 올바르게 인용하는 것을 잊지 마세요. 쉘은 작은따옴표로 묶인 문자열 내부를 찾지 않습니다.

path_value='/home/username/filename$1.class'
printf '%s\n' "$path_value"

출력 /home/username/filename$1.class.

su username -c "printf '%s\n' '$path_value'"

동일한 출력.

두 번째 명령에서는현재의path_value쉘은 큰따옴표로 묶여 있기 때문에 명령 내부의 값을 확장합니다. 그러면 내부적으로 printf작은따옴표로 묶인 문자열이 인쇄됩니다.

관련된:


이것 은 ${variable}정확히 동일 합니다 $variable. 추가는 {...}어떤 방식으로든 이를 참조하지 않으며 에서와 같이 확장 바로 뒤의 문자가 이름의 일부로 간주되는 경우에만 필요합니다 "${variable}x".

관련 정보