터미널에서 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는 !
큰따옴표 내에서 확장을 시도합니다. 그러니 작은따옴표로 묶거나 이스케이프하세요 \
.