首页 > 解决方案 > 当我的程序使用内部数据库时,如何从 bash 可执行文件在 linux 中创建命令?

问题描述

我在 bash 中编写了一个小程序,并希望使用自定义命令在我的计算机上的任何位置执行它。此外,我的程序使用了一个小型内部数据库,我也希望将其“嵌入”到程序中。下面是我的问题的一个例子,以及我到目前为止所尝试的。

假设我的程序返回用户选择的巴西州的首府。程序文件夹有 3 个文件。一个内部基地称为capitals.csv

Capitais,Estados,Siglas dos Estados,Regiões
Rio Branco,Acre,AC,Norte
Maceió,Alagoas,AL,Nordeste
Macapá,Amapá,AP,Norte
Manaus,Amazonas,AM,Norte
Salvador,Bahia,BA,Nordeste
Fortaleza,Ceará,CE,Nordeste
Brasília,Distrito Federal,DF,Centro-Oeste
Vitória,Espírito Santo,ES,Sudeste
Goiânia,Goiás,GO,Centro-Oeste
São Luís,Maranhão,MA,Nordeste
Cuiabá,Mato Grosso,MT,Centro-Oeste
Campo Grande,Mato Grosso do Sul,MS,Centro-Oeste
Belo Horizonte,Minas Gerais,MG,Sudeste
Belém,Pará,PA,Norte
João Pessoa,Paraíba,PB,Nordeste
Curitiba,Paraná,PR,Sul
Recife,Pernambuco,PE,Nordeste
Teresina,Piauí,PI,Nordeste
Rio de Janeiro,Rio de Janeiro,RJ,Sudeste
Natal,Rio Grande do Norte,RN,Nordeste
Porto Alegre,Rio Grande do Sul,RS,Sul
Porto Velho,Rondônia,RO,Norte
Boa Vista,Roraima,RR,Norte
Florianópolis,Santa Catarina,SC,Sul
São Paulo,São Paulo,SP,Sudeste
Aracaju,Sergipe,SE,Nordeste
Palmas,Tocantins,TO,Norte

一个python文件:

#get_capital.py
import pandas as pd
import sys
from unidecode import unidecode

df=pd.read_csv("capitais.csv")

df["Estados"] = [unidecode(k.lower()) for k in df["Estados"]]
user_state = unidecode(sys.argv[1].lower())
answer = df[df["Estados"]==user_state]["Capitais"].to_list()[0]

print("A capital de {} é {}".format(user_state.title(), answer))

最后,一个 bash 文件:

#!/usr/bin/bash
python get_capital.py $1

执行的一个例子是:

bash stack.sh bahia

输出:

A capital de Bahia é Salvador

到目前为止我已经尝试过:

我在这里读到,可以创建一种指向 bash 文件的超链接,以便可以从计算机上的任何位置调用它。为此,我只需键入:

 sudo ln -s PATH / stack.sh /usr/bin/stack.sh

PATH我的 bash 文件当前所在的路径在哪里。

这行得通,但它仍然不是我想要的,原因有两个。首先,我仍然需要bash在文件名之前使用这个词。我知道我可以使用创建二进制文件chmod +x stack.sh(有关此问题的更多详细信息,请参阅此问题)。但是,我想做的只是使用自定义命令stack而不是./stack. 此外,虽然超链接有效并且我可以从计算机上的任何位置访问我的 bash 文件,但我的程序本身只能在其原始文件夹中工作,因为 csv 文件只在那里。

无论如何,我如何将这些文件“打包”到一个文件夹中,该文件夹可以从我的计算机上的任何位置访问并且可以使用自定义命令调用?

标签: linuxbash

解决方案


推荐阅读