diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-03-21 13:03:42 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-03-21 13:03:56 -0400 |
commit | b0d8f2d983cb25d1035fae1cd7de214dd67809b4 (patch) | |
tree | 765a0ea3579a960f3574a38e229338011b804e3a /src/bin/psql/command.c | |
parent | 0f85db92b9ea167d3b9e90f3fb5fb3b9a93babc2 (diff) |
Add SHELL_ERROR and SHELL_EXIT_CODE magic variables to psql.
These are set after a \! command or a backtick substitution.
SHELL_ERROR is just "true" for error (nonzero exit status) or "false"
for success, while SHELL_EXIT_CODE records the actual exit status
following standard shell/system(3) conventions.
Corey Huinker, reviewed by Maxim Orlov and myself
Discussion: https://postgr.es/m/CADkLM=cWao2x2f+UDw15W1JkVFr_bsxfstw=NGea7r9m4j-7rQ@mail.gmail.com
Diffstat (limited to 'src/bin/psql/command.c')
-rw-r--r-- | src/bin/psql/command.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 61ec049f054..d7731234b63 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -5041,6 +5041,21 @@ do_shell(const char *command) else result = system(command); + if (result == 0) + { + SetVariable(pset.vars, "SHELL_EXIT_CODE", "0"); + SetVariable(pset.vars, "SHELL_ERROR", "false"); + } + else + { + int exit_code = wait_result_to_exit_code(result); + char buf[32]; + + snprintf(buf, sizeof(buf), "%d", exit_code); + SetVariable(pset.vars, "SHELL_EXIT_CODE", buf); + SetVariable(pset.vars, "SHELL_ERROR", "true"); + } + if (result == 127 || result == -1) { pg_log_error("\\!: failed"); |