<> == How do I invoke a shell command from a non-shell application? == You can use the shell's `-c` option to run the shell with the sole purpose of executing a short bit of script: {{{#!highlight bash sh -c 'echo "Hi! This is a short script."' }}} This is usually pretty useless without a means of passing data to it. The best way to pass bits of data to your shell is to pass them as positional arguments: {{{#!highlight bash sh -c 'echo "Hi! This short script was run with the arguments: $@"' -- "foo" "bar" }}} Notice the -- before the actual positional parameters. The first argument you pass to the shell process (that isn't the argument to the `-c` option) will be placed in `$0`. Positional parameters start at `$1`, so we put a little placeholder in `$0`. This can be anything you like; in the example, we use the generic `--`. This technique is used often in shell scripting, when trying to have a non-shell CLI utility execute some bash code, such as with [[UsingFind|find(1)]]: {{{#!highlight bash find /foo -name '*.bar' -exec bash -c 'mv "$1" "${1%.bar}.jpg"' -- {} \; }}} Here, we ask `find` to run the `bash` command for every `*.bar` file it finds, passing it to the `bash` process as the first positional parameter. The `bash` process runs the `mv` command after doing some [[BashFAQ/073|Parameter Expansion]] on the first positional parameter in order to rename our file's extension from `bar` to `jpg`. Alternatively, if your non-shell application allows you to set environment variables, you can do that, and then read them using normal variables of the same name. Similarly, suppose a program (e.g. a file manager) lets you define an external command that an argument will be appended to, but you need that argument somewhere in the middle. In that case: {{{#!format none #!/bin/sh sh -c 'command foo "$1" bar' -- "$@" }}} === Calling shell functions === Only a shell can call a shell function. So constructs like this won't work: {{{#!highlight bash # This won't work! find . -type f -exec my_bash_function {} + }}} If your shell function is '''defined''' in a file, you can invoke a shell which sources that file, and then calls the function: {{{#!highlight bash find . -type f -exec bash -c 'source /my/bash/function; my_bash_function "$@"' _ {} + }}} (See UsingFind for explanations.) Bash also permits function definitions to be ''exported'' through the environment. So, if your function is defined within your current shell, you can export it to make it available to the new shell which `find` invokes: {{{#!highlight bash # Bash export -f my_bash_function find . -type f -exec bash -c 'my_bash_function "$@"' _ {} + }}} This works ONLY in bash, and isn't without problems. The maximum length of the function code cannot exceed the max size of an environment variable, which is platform-specific. Functions from the environment can be a security risk as well because bash simply scans environment variables for values that fit the form of a shell function, and has no way of knowing who exported the function, or whether a value that happens to look like a function really is one. It is generally a better idea to retrieve the function definition and put it directly into the code. This technique is also more portable. {{{#!highlight bash # Bash/ksh/zsh function someFunc { : } bash -s <