Como eu chamo um executável como se fosse chamado de outra pasta?

0

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.

    
por HatTricks 12.08.2014 / 01:44

4 respostas

1

(cd ~ && /bin/food)

Isso é lançado em um subnível.

    
por 12.08.2014 / 02:05
0

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.

    
por 12.08.2014 / 02:39
0

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

    
por 12.08.2014 / 02:46
0

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 :

  1. Invoque touch com o caminho completo do diretório de onde criar food.txt
  2. Armazene o caminho do diretório como uma variável e, em seguida, combine-o em touch
  3. Passe o caminho do diretório como um argumento ao invocar o script 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
    
por 12.08.2014 / 01:58

Tags