내가 Linux 시스템에 루트로 연결되어 있다고 가정해 보겠습니다.
내가 이것을 입력하고 있는 동안 도대체 무슨 일이 일어나고 있는 걸까 unset *
?
답변1
나는 귀하의 쉘이 Bash라고 가정하지만 다음은 대부분의 Bourne/POSIX 유사 쉘에도 적용됩니다.
한마디로 순서가 의미가 없습니다.
쉘은 먼저 별표를 *
현재 디렉토리에 있는 모든 파일 및 디렉토리의 이름으로 대체합니다(점으로 시작하는 이름은 제외) .
. 그런 다음 unset
해당 목록의 명령을 호출합니다 .
목적은 unset
프로세스 파일이 아닌 쉘 변수를 삭제하는 것입니다. 파일이나 디렉터리 이름이 현재 정의된 쉘 변수와 일치하는 경우 해당 변수는 삭제됩니다. 쉘 변수에 해당하지 않는 이름은 전혀 효과가 없거나 쉘 변수에 대해 불법적인 문자가 포함된 경우 유사한 오류 메시지를 생성합니다 not a valid identifier
.
실제로 unset
명령은 약간 복잡합니다. 예를 들어 변수는 읽기 전용으로 표시될 수 있으며 이 경우 설정을 해제할 수 없습니다. 변수뿐만 아니라 함수에서도 작동합니다. 그러나 이는 일반적인 상황에서 의미가 없는 명령 요약을 변경하지 않습니다.
또한 Stéphane Chazelas가 언급했듯이 변수 이름을 사용하는 모든 내장 함수와 마찬가지로 unset
주로 배열 인덱스처럼 보이는 데이터에 잠재적으로 위험한 부작용이 있습니다. 예를 들어 파일이 HOME[$(some command)]
존재하는 unset *
경우명령 대체 실행배열 인덱스를 평가하려고 할 때. 바라보다:쉘 산술 평가에서 정리되지 않은 데이터 사용의 보안 영향