Printf는 백슬래시와 느낌표를 해석할 수 없습니다.

Printf는 백슬래시와 느낌표를 해석할 수 없습니다.

터미널에서 Java 프로그램을 작성하고 printf출력을 파일로 리디렉션하고 .java있지만 printf수평 백슬래시 탭( )을 해석할 수 없으며 \t문자열에 느낌표(!)가 있으면 프로그램이 실행되지 않습니다. 인쇄도 안 되고 다음 오류가 발생하여 실패합니다.

bash: !": event not found

  • printf에 가로 탭을 강제로 포함시키는 방법은 무엇입니까?

  • 위의 오류가 발생하지 않고 어떻게 느낌표를 추가할 수 있나요?

명령줄 매개변수:

$ printf "%s\n" "public class {" "\tpublic static void main(String[] args) {" "dogBark()" "}" "public static void dogBark() {" "System.out.println("Woof")" "}" "}" > barkingDog.java

.java파일에서 출력

$ less barkingDog.java
public class {
\tpublic static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println(Woof)
}

}

답변1

여기서 문서를 사용하는 것이 .bash printf쉘의 내장을 사용하는 것보다 나을 수 있습니다.help printf

 %b   expand backslash escape sequences in the corresponding argument

bash그리고 이것이 역사적 확장으로 간주되는 것을 방지하려면 !문자열을 작은따옴표로 묶으십시오.

$ printf '%b\n' 'public class {' '\tpublic static void main(String[] args) {' 'dogBark()' '}' 'public static void dogBark() {' 'System.out.println("Woof!")' '}' '}'
public class {
    public static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println("Woof!")
}
}

바라보다큰 소리를 내는 방법!

답변2

printf\t인쇄된 문자열의 백슬래시 문자(예:)는 해석될 수 없습니다 . 형식 문자열에서만:

$ printf '\t%s' "test" "string"
    test    string

해결 방법으로 인쇄하려는 문자열에 실제 탭 문자를 삽입할 수 있습니다.

%b백슬래시 문자를 해석할 수 있는 형식 문자열을 사용할 수 있습니다 .

$ printf '%b' "\ttest" "\tstring"
    test    string

이 문자는 !역사적 확장에 사용됩니다. 하지만 이는 따옴표 없이 사용할 때만 발생합니다. 를 포함 \하거나 '포함하지 않고 인용만 하면 "확장이 방지됩니다. 그래도 문제가 지속되면 기록 확장을 비활성화할 수 있습니다.

$ set +H

이것은 작동합니다:

$ printf "%b\n" \
         "public class {" \
         "\tpublic static void main(String[] args) {" \
         "dogBark()" \
         "}" \
         "public static void dogBark() {" \
         "System.out.println(\"Woof\!\")" \
         "}" \
         "}" > barkingDog.java

$ cat barkingDog.java 
public class {
        public static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println("Woof!")
}
}

그러나 분명히 여기에 있는 문서는 더 간단합니다.

$ cat <<\EOT >barkingDog.java
public class {
       public static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println("Woof!")
}
}
EOT

답변3

다음과 같이 ANSI-C 인용문을 사용하여 원하는 것을 달성할 수 있다고 생각합니다.

printf "%s\n" "public class {" \
$'\tpublic static void main(String[] args) {' \
"dogBark()" \
"}" \
"public static void dogBark() {" \
"System.out.println("Woof")" \
"}" \
"}" > barkingDog.java

산출:

public class {
        public static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println(Woof)
}
}

느낌표의 경우 히스토리 확장이 활성화되면 bash는 !큰따옴표 내에서 확장을 시도합니다. 그러니 작은따옴표로 묶거나 이스케이프하세요 \.

관련 정보