명령 대체 명령에서 stderr 경고 메시지를 억제하는 방법은 무엇입니까?

명령 대체 명령에서 stderr 경고 메시지를 억제하는 방법은 무엇입니까?
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 '/' '\\')

관련 정보