Backquotes delimitam uma substituição de comando : o comando dentro das backquotes é executado e sua saída é interpolada na linha de comando. (Existem mais complicações se os retratos posteriores não estiverem entre aspas duplas, mais sobre isso posteriormente.) Então, o que está acontecendo é que git rev-list … é executado no diretório atual, antes que RepoScan seja executado. Não pode ser diferente, pois a saída do comando git é passada como argumentos para RepoScan .
Se você quiser que RepoScan execute um comando que você especificar quando invocá-lo, será necessário passar esse comando na linha de comando de RepoScan , não na saída desse comando. Existem duas maneiras de fazer isso, dependendo do que você quer dizer com comando.
Passando um executável com argumentos
Se o comando for interpretado como um executável com alguns argumentos, passe o comando como uma lista de palavras .
./RepoScan git rev-list -n 1 --before="2016-04-29 23:59" master
Dentro do script RepoScan , use "$@" para se referir ao comando. A notação @ é uma variável especial que representa a lista de argumentos. Quando usado dentro de aspas duplas, tem um comportamento especial: cada argumento é colocado em uma palavra separada, que é o que torna "$@" equivalente à lista de argumentos.
Se o comando RepoScan tiver outras opções, todas elas deverão ser passadas antes do comando. Use o shift incorporado para remover opções processadas desde o início da linha de comando. Normalmente, você usa as opções getopts para analisar.
Passando um fragmento de shell
A outra possibilidade é passar um trecho de programa shell como um único argumento.
./RepoScan 'git rev-list -n 1 --before="2016-04-29 23:59" master'
Observe os dois níveis de cotação desta vez. As aspas simples são para o shell no qual você está chamando RepoScan ; tudo dentro de aspas simples é interpretado literalmente, então RepoScan recebe um argumento que é a string git rev-list -n 1 --before="2016-04-29 23:59" master . Dentro de RepoScan , desde que você tenha um fragmento de shell, execute-o com
eval "$1"
se o snippet estiver no primeiro parâmetro ou
eval "$command"
se o snippet estiver na variável command .
Observe o duplo aspas em torno da expansão da variável . Isso é necessário porque $foo de aspas duplas não significa “o valor de foo ”, mas “pegue o valor de foo , divida-o de acordo com IFS e interprete o resultado como uma lista de padrões globais” (também conhecido como o operador split + glob).