touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\') 2> /dev/null
foo는 디렉토리입니다.
foo의 전체 경로 이름을 읽고 파일로 생성하고, 모든 "/"를 "\"로 바꾸고, 디렉토리가
/home/test/foo
파일을 생성할 수 있도록 디렉터리_를 앞에 두는 것입니다.directory_\home\test\foo
경고를 계속 인쇄한다는 점을 제외하면 내가 원하는 것을 정확히 수행합니다.tr: warning: an unescaped backslash at end of string is not portable
ㅏ. 무슨 뜻인지 모르겠어요 B. 안 나왔으면 좋겠어요
stderr를 리디렉션하려고 시도했지만 /dev/null
성공하지 못했습니다. 어떻게 취소하나요?
답변1
오류 메시지는 이스케이프 처리되지 않은 백슬래시가 있음을 의미합니다. *nix 세계에서는 특수 문자 앞에 백슬래시를 붙여 "이스케이프"할 수 있습니다. 즉, 특수 문자가 아닌 단순 문자로 해석됩니다. 예를 들어:
$ printf 'foo\nbar'
foo
bar
\n
개행 문자를 나타내는 특수 문자 입니다 . 그러나 슬래시를 벗어나면 다음과 같은 결과를 얻습니다.
$ printf 'foo\\nbar'
foo\nbar
따라서 백슬래시를 이스케이프 처리하여 제거할 수 있습니다.
touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\\')
또는 오류 출력을 리디렉션하여 tr
( touch
현재 수행 중인 작업이 아님):
touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null)
그러나 나는 그것을 강조해야 한다.이것은 매우 나쁜 생각입니다®백슬래시를 사용하여 파일 이름을 만듭니다. 진짜. 나중에 구문 분석하고 처리하는 것은 지옥이 될 것입니다. 왜 다른 캐릭터를 사용하지 않습니까?
답변2
tr
일부 확장은 리디렉션 전에 발생하므로 이를 명령에 직접 입력해야 합니다 .
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)
답변3
이중 백슬래시와 함께 작은따옴표를 사용하면 오류가 발생하지 않습니다.
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\\')