에서 아무 곳에 bash
나 입력하면 cd ~sys
로 끝납니다 /dev
. 프롬프트에서와 동일 zsh
하지만 로 끝납니다.~sys
/dev
Kubuntu 22.04, Ubuntu 20.04, Raspbian 9.13을 확인했습니다.
Google 검색에서는 결과가 나오지 않았습니다.
답변1
입력하면 cd ~sys
사용자의 홈 디렉토리로 변경됩니다 sys
. cd ~roaima
사용자의 홈 디렉토리로 변경하는 것과 같습니다 roaima
. 자신의 홈 디렉토리에 대한 바로 가기는 간단하므로 ~
사용 방법을 이미 알고 있을 것입니다.
비밀번호 파일에서( grep '^sys:' /etc/passwd
또는 더 일반적으로 getent passwd sys
) 볼 수 있는 홈 디렉토리는 sys
다음과 같습니다 /dev
.
sys:x:3:3:sys:/dev:/usr/sbin/nologin
이는 cd ~sys
디렉토리로 변경된 이유를 설명합니다 /dev
.
원래 질문에는 ~sys
동사 없이 입력만 언급되어 있습니다. 이 예에서 쉘은 ~sys
홈 디렉토리로 변경 /dev
한 다음 이를 프로그램으로 실행하려고 시도합니다. 분명히 디렉토리는 프로그램이 될 수 없으므로 시도는 실패합니다.
~sys
-bash: /dev: Is a directory
/dev
-bash: /dev: Is a directory
예를 들어, 쉘을 실행 중인 경우 bash
이 동작을 무시하고 쉘이 해당 디렉토리로의 변경 표시로 디렉토리를 실행하려는 시도를 처리하도록 할 수 있습니다(예: 암시적 cd
).
shopt -s autocd
~sys # → "cd -- /dev"
pwd # → "/dev"
~ # → "cd -- /home/roaima"
pwd # → "/home/roaima"
바라보다shopt -s autocd를 사용할 때 주의 사항이 있나요?추가 논의를 위해.
답변2
~foo
사용자의 홈 디렉토리로 확장됩니다 foo
. 이는 bash, zsh 및 보다 일반적으로 모든 POSIX 호환 쉘, BusyBox ash, (t)csh(원본) 및 Fish를 포함한 거의 모든 최신 쉘의 기능입니다.
Unix 시스템에는 많은 시스템 계정이 있는데, 일부는 타당한 이유가 있고 다른 일부는 대부분 역사적입니다. 이러한 시스템 계정에는 로그인하지 않더라도 홈 디렉터리가 있습니다. 이는 대체로 역사적입니다(해당 필드를 비워 두는 것이 제대로 지원되는지 확실하지 않으므로 어쨌든 거기에 뭔가가 있어야 합니다. /nonexistent
). 데비안 시스템에는 이라는 시스템 사용자가 있는데 sys
, 내 생각에는 몇 년(수십 년?) 동안 사용되지 않았지만 이전 버전과의 호환성을 위해 여전히 존재합니다. 사용자의 홈 디렉터리는 입니다 /dev
. 따라서 셸 및 기타 많은 프로그램에서 ~sys
(또는 사용자 이름과 홈 디렉터리가 무엇이든) 확장됩니다./dev
~daniel
/home/daniel
zsh에서 (대부분의 사람들처럼) 당신이 포함한다면%~
프롬프트 이스케이프 시퀀스프롬프트에서 프롬프트에는 현재 디렉토리(약어로 표시될 수 있음)가 포함됩니다. 현재 디렉터리가 홈 디렉터리 아래에 있는 경우 이 섹션은 로 축약됩니다 ~
. Zsh는 한 단계 더 나아가 다음으로 축약될 수 있는 다른 디렉터리도 축약합니다.물결표 확장. 특히 이전에 구문을 사용하여 사용자의 홈 디렉토리를 참조한 경우 ~foo
zsh는 해당 디렉토리를 로 축약할 수 있음을 기억합니다 ~foo
.
zsh는 이 함수를 호출합니다.정적 명명된 디렉터리. zsh가 명명된 디렉터리를 기억하는 곳은 내장 명령을 사용하여 액세스할 수 있는 디렉터리 해시 테이블입니다.hash -d
그리고unhash -d
.
darkstar% PS1='%~%% '
~% cd /dev
/dev% hash -d # No known directory abbreviations so far
/dev% echo ~sys # Let's use ~sys
~sys% hash -d # Now ~sys=/dev, seen in the hash table and the prompt
sys=/dev
~sys% unhash -d sys # Forget the abbreviation
/dev% # Now the prompt is no longer "abbreviated"
짜증나게도 zsh는 "약어"가 더 짧은 경우 ~foo
귀중한 홈 디렉토리 약어로 간주합니다.foo
아니면 언제까지나원시 문자열로. 나는 같은 길이의 이름이 붙은 디렉터리를 잊어버리게 만들었습니다.
function chpwd_prompt {
# If a user foo has the home directory /bar and length("foo") <
# length("bar") then zsh shows `/bar' as `~foo'. If length("foo")
# = length("bar") then zsh still favors `~foo', but I want `/bar'.
if [[ ${(%):-%~} == \~* && ${#${(%):-%~}} -eq $#PWD ]]; then
unhash -d -- ${${${(%):-%~}%%/*}#\~}
fi
}
chpwd_functions+=(chpwd_prompt)
이 코드는 아래 디렉터리만 축약하거나 자체를 /home
축약하는 등 다양한 기본 설정에 맞게 조정할 수 있습니다(이렇게 하면 홈 디렉터리에서 시작하여 홈 디렉터리만 바꾸는 것이 ~
더 쉬워지지만 ).%/
답변3
이 용어는 ~sys
사용자의 홈 디렉토리를 나타냅니다 sys
. 실행하면 볼 수 있습니다 getent passwd sys
. 홈 디렉토리는 로 나열됩니다 /dev
.
살펴봤지만 실제로 해당 사용자 계정이 무엇인지 잘 모르겠습니다. 분명히 시스템 계정이고(낮은 ID 번호 3에서 볼 수 있듯이) 그룹에 속해 있습니다 sys
(다시 " 시스템 계정 그룹"”), 그러나 최신 Ubuntu 설치에서는 파일이나 프로세스를 소유하거나 액세스할 수 없습니다. 이는 레거시 문제일 수 있습니다.
답변4
물론. 추가 액세스가 필요하지만 전체 루트가 필요하지 않은 작업의 경우 일반적으로 adm은 "관리" 목적으로 사용되고 sys는 "시스템" 목적으로 사용됩니다. 이것은 매우 모호하지만 실제로는 엄격하게 표준화되지 않았기 때문입니다.
분명히 오늘날의 아치 리눅스에서는 adm이 일반 사용자가 읽을 수 없는 /var/log의 파일에 접근할 수 있고, sys는 컵 관리에 접근할 수 있습니다. 콘텐츠의 기존 사용자/그룹 인쇄).
Debian/Ubuntu에서는 sys가 전혀 사용되지 않으며 uucp 및 기타 일부도 사용되지 않을 수 있지만 전통적이므로 그대로 유지됩니다. (비밀번호가 없으면 쉘은 nologin으로 설정되고 자신이 소유한 파일이 없으면 사실상 비활성 상태이므로 이론적 보안 관점에서도 아무런 해를 끼치지 않습니다.)