# ! command

The ! command creates a UNIX shell and
executes any UNIX command.

**Synonyms:** sh

Note: **For Windows:** Running a Windows program that
requires input results in a hung program.

## Syntax

```
!{unix.command}
```

## Description

The UNIX command parameter is
any UNIX command. A shell is created and the command submitted to
it. If the UNIX command parameter is omitted, a shell is *pushed*. D3 messages are held until the UNIX command is complete. If more
than one message is received, only the last one displays when returning
to TCL.

Each time the ! or sh command is invoked, a new shell is *pushed* on *top* of
TCL. Control is transferred to this shell. Pressing CTRL+D returns
control to TCL.

Note: The syntax for this command does not require
a space after the ! character.

Macros
in the master dictionary make almost all UNIX commands available from
D3. Listed below are two useful tips on using this facility:

- Avoid creating an intermediate shell process. The sh command uses the system UNIX library call to execute the UNIX command. This command creates a new process, which executes the default shell /bin/sh and passes the string to this new shell. In turn, this new process creates another shell process, which does an exec of the UNIX command. The intermediate process, the one created by the system, is normally useless. The macro structure below avoids the creation of a third process: ```
01 n
02 !exec command
``` The exec shell command replaces the second process.

- Changing and setting environment variables.After a shell is created, it inherits environment variables from the D3 process. It is possible to change any variable in the macro itself. For example, consider this example: ```
myshell
01 n
02 !cd /usr/mydir; TERM=ibm3151; export TERM; exec sh
``` This macro changes the default directory, sets a new (UNIX) terminal type and finally executes a shell. By typing env in this new shell, the new setting is shown. To permanently set environment variables, use the TCL environ.

## See also

- [create-macro command](https://d3codex.com/tcl/create-macro-command/)
- [env command](https://d3codex.com/unix/env-command/)
- [environ command](https://d3codex.com/tcl/environ-command/)
- [Macros](https://d3codex.com/definitions/macros-glossary/)
- [psh command](https://d3codex.com/tcl/psh-command/)
- [psr command](https://d3codex.com/tcl/psr-command/)

---
Source: https://d3codex.com/tcl/exclamation-command/ - part of the D3Codex reference.
