man bash
พูดว่า:
exec [-cl] [-a name] [command [arguments]]
If command is specified, it replaces the shell. No new process
is created. The arguments become the arguments to command. If
the -l option is supplied, the shell places a dash at the
beginning of the zeroth argument passed to command. This is
what login(1) does. The -c option causes command to be executed
with an empty environment. If -a is supplied, the shell passes
name as the zeroth argument to the executed command. If command
cannot be executed for some reason, a non-interactive shell
exits, unless the execfail shell option is enabled. In that
case, it returns failure. An interactive shell returns failure
if the file cannot be executed. If command is not specified,
any redirections take effect in the current shell, and the
return status is 0. If there is a redirection error, the return
status is 1.
สองบรรทัดสุดท้ายเป็นสิ่งสำคัญ: หากคุณรันexec
ด้วยตัวเองโดยไม่มีคำสั่งมันจะทำให้การเปลี่ยนเส้นทางใช้กับเชลล์ปัจจุบัน คุณอาจรู้ว่าเมื่อคุณรันcommand > file
เอาต์พุตของcommand
ถูกเขียนไปยังfile
แทนที่จะไปยังเทอร์มินัลของคุณ (ซึ่งเรียกว่าการเปลี่ยนเส้นทาง ) หากคุณรันexec > file
แทนการเปลี่ยนทิศทางจะใช้กับเชลล์ทั้งหมด: เอาต์พุตใด ๆ ที่สร้างโดยเชลล์จะถูกเขียนไปยังfile
แทนที่จะเป็นเทอร์มินัลของคุณ ตัวอย่างที่นี่
bash-3.2$ bash
bash-3.2$ exec > file
bash-3.2$ date
bash-3.2$ exit
bash-3.2$ cat file
Thu 18 Sep 2014 23:56:25 CEST
ฉันเริ่มbash
เปลือกใหม่ก่อน จากนั้นในเปลือกใหม่นี้ผมทำงานเพื่อให้การส่งออกทั้งหมดจะถูกเปลี่ยนเส้นทางไปยังexec > file
file
อันที่จริงหลังจากนั้นผมทำงานแต่ฉันได้รับการส่งออกไม่เพราะการส่งออกจะถูกนำไปdate
file
จากนั้นฉันออกจากเชลล์ (เพื่อไม่ให้การเปลี่ยนเส้นทางใช้อีกต่อไป) และฉันเห็นว่าfile
มีเอาต์พุตของdate
คำสั่งที่ฉันรันก่อนหน้านี้