Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add log_all_output #84

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,48 @@ echo -n >file
printf '' >file
```

## Use `exec` to redirect script output to different file descriptors

`exec` can be used to redirect script output to file descriptors. In the example below, `stdout` and `stderr` are redirected to `myoutput.log` (a file).

**Example Function:**

```sh
log_all_output() {
# Usage: log_all_output log_filename
exec 6>&1 # save stdout
exec 7>&2 # save stderr
exec &>"$1"
}

stop_logging_output() {
exec 1>&6 6>&- # Restore stdout
exec 2>&7 7>&- # Restore stderr
}
```

**Example Usage:**

```shell
# These are *not* logged.
printf 'This is a message.\n'
printf 'This is an error message.\n' >&2

# All script output will go to 'myoutput.log'.
log_all_output myoutput.log

# These are now logged.
printf 'This is a message.\n'
printf 'This is an error message.\n' >&2

# Return to normal.
stop_logging_output

# These are not logged.
printf 'This is a message.\n'
printf 'This is an error message.\n' >&2
```

## Extract lines between two markers

**Example Function:**
Expand Down
42 changes: 42 additions & 0 deletions manuscript/chapter4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,48 @@ echo -n >file
printf '' >file
```

## Use `exec` to redirect script output to different file descriptors

`exec` can be used to redirect script output to file descriptors. In the example below, `stdout` and `stderr` are redirected to `myoutput.log` (a file).

**Example Function:**

```sh
log_all_output() {
# Usage: log_all_output log_filename
exec 6>&1 # save stdout
exec 7>&2 # save stderr
exec &>"$1"
}

stop_logging_output() {
exec 1>&6 6>&- # Restore stdout
exec 2>&7 7>&- # Restore stderr
}
```

**Example Usage:**

```shell
# These are *not* logged.
printf 'This is a message.\n'
printf 'This is an error message.\n' >&2

# All script output will go to 'myoutput.log'.
log_all_output myoutput.log

# These are now logged.
printf 'This is a message.\n'
printf 'This is an error message.\n' >&2

# Return to normal.
stop_logging_output

# These are not logged.
printf 'This is a message.\n'
printf 'This is an error message.\n' >&2
```

## Extract lines between two markers

**Example Function:**
Expand Down
15 changes: 14 additions & 1 deletion test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,19 @@ test_split() {
assert_equals "${result[*]}" "hello world my name is john"
}

test_log_all_output() {
(
log_all_output test.log
printf stdout
printf stderr >&2
stop_logging_output
printf stdout
printf stderr >&2
) &> /dev/null
contents="$(<test.log)"
assert_equals "$contents" "stdoutstderr"
}

assert_equals() {
if [[ "$1" == "$2" ]]; then
((pass+=1))
Expand All @@ -219,7 +232,7 @@ assert_equals() {
}

main() {
trap 'rm readme_code test_file' EXIT
trap 'rm readme_code test_file test.log' EXIT

# Extract code blocks from the README.
while IFS=$'\n' read -r line; do
Expand Down