몇 줄의 텍스트를 인쇄하는 스크립트가 있습니다. 이 텍스트는 다른 프로세스에서 구성으로 사용됩니다.
프로그램을 정상적으로 실행하면 표준 출력을 파일로 리디렉션하고 정상적으로 작동합니다.
./generateConfig.sh > normal.cfg
그러나 문제는 Normal.cfg가 실제로 상수이고 추가 인수(예: -o, 인수 없음)를 제공하여 사용자에게 파일로 인쇄하거나 화면에 인쇄할 수 있는 옵션을 제공하고 싶다는 것입니다.
스크립트 내용이 다음과 같은 경우:
#!/bin/bash
echo "8.8.8.8"
매개변수에 따라 파일이나 표준 출력으로 인쇄되도록 출력을 매개변수화하려면 어떻게 해야 합니까?
이것은 작동하지 않는 것 같습니다:
#!/bin/bash
output="/dev/stdout"
if [ $# -gt 0 ]; then
output="normal.cfg"
fi
echo "8.8.8.8" > $output
답변1
몇 가지 방법들:
함수
#! /bin/sh -
[ "$#" -gt 0 ] && redir=true || redir=false
redir() if "$redir"; then "$@" > normal.cfg; else "$@"; fi
redir echo 8.8.8.8
별명:
#! /bin/sh -
[ -z "$BASH_VERSION" ] || shopt -s expand_aliases
[ "$#" -gt 0 ] && alias redir='>normal.cfg' || alias redir=
redir echo 8.8.8.8
posh
( 비활성화된 별칭 에는 적용되지 않습니다 .원천( .
명령 사용) AT&T 구현에서 ksh
).
개인 파일 설명자:
#! /bin/sh -
[ "$#" -gt 0 ] && exec 3> normal.cfg || exec 3>&1
echo 8.8.8.8 >&3
(ksh93을 제외한 많은 쉘은 fd 3에 close-on-exec 플래그를 설정하지 않으므로 수동으로 실행된 명령을 닫아야 할 수도 있습니다)
답변2
전체 스크립트 출력의 리디렉션을 사용할 수 있습니다 exec
.
#! /bin/bash
if [[ $1 = -o ]]
then
exec > "$2"
fi
echo "8.8.8.8"
이제 실행 스크립트를 사용하면 -o foo
출력이 파일에 저장됩니다 foo
.
$ ./foo.sh
8.8.8.8
$ ./foo.sh -o bar
$ cat bar
8.8.8.8
답변3
다음을 사용해 보세요:
#!/bin/bash
output="normal.cfg"
if [ $# -gt 0 ];
then
echo "8.8.8.8" > $output
else
echo "8.8.8.8"
fi
좀 더 복잡한 작업을 수행하려면 tee
다음 명령을 사용해 보세요.여기에서 예를 참조하세요..