Run any shell script through nfo logging — captures args, stdout/stderr, return code, and duration to SQLite.
@log_call on subprocess — wraps subprocess.run() with full nfo loggingpip install nfo
python examples/bash-wrapper/main.py echo "Hello from nfo-bash"
python examples/bash-wrapper/main.py ls -la
python examples/bash-wrapper/main.py ./deploy.sh prod
2026-02-12 | DEBUG | nfo-bash | run_bash() | args=('echo', 'Hello') | -> {...} | [2.38ms]
Hello from nfo-bash
from nfo import log_call, Logger, SQLiteSink
logger = Logger(name="nfo-bash", sinks=[SQLiteSink("bash_logs.db")])
@log_call
def run_bash(cmd, *args):
result = subprocess.run([cmd, *args], capture_output=True, text=True)
return {"stdout": result.stdout, "returncode": result.returncode}