(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