(cd ~ && /bin/food)
Isso é lançado em um subnível.
Digamos que eu tenha um programa food in /bin/ que cria o arquivo dinner.txt da seguinte forma:
#!/bin/bash
touch dinner.txt
Eu quero usar meu programa food para criar dinner.txt na minha pasta /home/ sem chamar cd /home/ primeiro. Em outras palavras, quero chamar food como se fosse chamado de /home/ . Como eu faria isso?
Editar: Suponha que não possa editar o programa food real.
A resposta é talvez. Existem três possibilidades que posso pensar.
1) O programa de comida tem uma opção que permite que o arquivo de saída seja especificado. A convenção é geralmente (mas nem sempre) uma opção -o outputfile . Executar man food ou tentar /bin/food -h talvez mostre quais opções estão disponíveis.
2) O programa de comida tem uma opção para escrever em SDTOUT . Se esse for o caso, você pode executar /bin/food <whatever option writes to STDOUT> > /home/dinner.txt .
3) Mova o arquivo dinner.txt após o programa food ser executado. Por exemplo. food; mv dinner.txt /home .
Seria útil saber por que você não deseja executar cd . A execução de cd /home; food; cd - executaria o programa em home e alteraria o diretório para o que era antes do comando food ser executado.
Você não pode editar o programa food , mas pode escrever um novo programa eats ?
#!/bin/bash
cd "${@}"
food
você pode
sudo mv /bin/food /bin/oldfood
sudo mv /bin/eats /bin/food
e mude o / bin / food para chamar oldfood
Editar:
Supondo que você não pode alterar o código do programa, você pode escrever um pequeno script que irá export food.sh como uma variável global e então irá executá-lo.
E, se você quiser remover completamente a dependência de diretório desse script, também poderá exportar o script de wrapper. Isso permitirá que você execute o script de qualquer caminho nesta sessão shell e sempre obtenha o arquivo de saída em /home/
Roteiro do wrapper wrapper_food.sh :
#!/bin/bash
export mkfood="/home/shadowme/mkfood.sh"
cd /home/shadowe/testdir/
$mkfood
Saída:
$ ls testdir
food.0.txt
Exportação do script de wrapper:
$ export wrapper_food=/home/shadowe/wrapperfood.sh
Você pode chamar o script acima de qualquer lugar no mesmo shell:
$ $wrapper_food
Resposta original:
De um modo geral, três maneiras vêm à mente para evitar cd /home/ antes de touch :
touch com o caminho completo do diretório de onde criar food.txt
touch
sh . Pode-se escolher cada um dos itens acima, dependendo do caso de uso. Por exemplo, se eu quiser sempre criar arquivos no mesmo diretório, não usarei a opção de argumento porque é mais entrada. Em vez disso, vou armazenar o caminho como uma variável.
O script abaixo fornece exemplos para cada um dos itens acima na ordem em que são mencionados.
Entrada:
$ ./mkfood.sh /home/shadowe/testdir
Saída:
$ ls /home/shadowe/testdir
food1.txt food2.txt food.txt
Script:
#!/bin/bash
# store path as variable
dir_path="/home/shadowe/testdir"
touch $dir_path/food.txt
#direct path
touch /home/shadowe/testdir/food1.txt
# argument pass
touch $1/food2.txt
Por fim, mesmo que não tenha sido perguntado, é possível passar o nome do arquivo para ser criado como um argumento, alterando o comando do argumento para touch $1/$2 . Por exemplo:
$ ./mkfood.sh /home/shadowe/testdir food2.txt
Tags bash