
date
명령을 다음과 같은 형식으로 만들고 싶습니다 .
$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58
하지만 다음과 같은 스크립트에서 호출할 수 있도록 변수에 저장하고 싶습니다.
echo "$(nice_date) [WARNING] etc etc"
그러나 그것은 작동하지 않습니다
$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S’
Try 'date --help' for more information.
$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.
$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.
date 명령이 올바른 매개변수를 얻도록 이를 수행하는 올바른 방법은 무엇입니까?
답변1
예제가 실패한 이유는 쉘의 단어 분리가 작동하는 방식 때문입니다. 을 실행하면 "$($nice_date)"
셸은 date
두 개의 인수 "+%Y-%m-%d"
와 를 사용하여 명령을 실행합니다 "%H:%M:%S"
. 날짜의 형식 문자열은 단일 인수여야 하기 때문에 실패합니다.
이를 수행하는 가장 좋은 방법은 명령을 변수에 저장하는 대신 함수를 사용하는 것입니다.
format_date() {
# echo is not needed
date "+%Y-%m-%d %H:%M:%S" "$@"
}
format_date
format_date -d "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"
실제로 명령을 변수에 저장하려면 배열을 사용할 수 있습니다.
nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" -d "2015-09-17 16:51:58"
변수에 명령을 저장하는 과정의 복잡성에 대한 자세한 내용은 다음을 참조하세요.배쉬 FAQ 050.
답변2
간단한 방법은 \를 사용하여 공간을 "탈출"하는 것입니다.
nice_date="date +%Y-%m-%d\ %H:%M:%S"
답변3
나는 기능이 가장 좋은 방법이라는 데 동의합니다. 대안으로 전체 명령 대신 형식을 변수로 저장하십시오.
$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"
답변4
바꾸다:
nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"
노력하다:
nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")
또한 마지막 명령 대체가 필요하지 않습니다.
date "$nice_date_format"