Supondo que eu esteja na mesma pasta que um arquivo executável, eu precisaria digitar isto para executá-lo:
./file
Prefiro não precisar digitar /, porque /é difícil para mim digitar.
Existe uma maneira mais fácil de executar um arquivo? Idealmente, apenas algumas sintaxes simples, como:
.file
ou qualquer outra coisa, mas mais fácil do que ter que inserir o /caractere lá.
Talvez haja alguma maneira de colocar algo no /bin
diretório ou criar um alias para o intérprete, para que eu possa usar:
p file
filenames
executable
IMSoP
fonte
fonte
/
é amplamente utilizado no Unix, principalmente como um separador de diretório. Provavelmente, é melhor encontrar uma maneira mais fácil de digitá-la./
não é difícil digitar para a grande maioria das pessoas e, se o OP tiver uma lesão que evite isso, eles deverão considerar layouts alternativos do teclado, pois não há como evitar/
completamente enquanto estão no terminal./
turno-7, que é relativamente difícil de digitar, mesmo sem ferimentos.Respostas:
Pode ser "arriscado", mas você poderia ter. no seu CAMINHO.
Como já foi dito em outros, isso pode ser perigoso, portanto, sempre garanta. está no final do CAMINHO e não no começo.
fonte
cd
um diretório que possa ser gravado mundialmente e tentar usar um comando que não esteja no seu caminho, poderá executar um executável (possivelmente malicioso) com o mesmo nome que alguém escreveu nesse caminho. Isso é muito pior se você colocar.
no início do seu caminho. Nesse caso, um executável malicioso chamadols
seria executado se você tentar chamarls
nesse diretório.p
comando seria melhor..
inícioPATH
, tudo que um usuário mal-intencionado precisa fazer é soltar umls
comando falso em seu diretório e convencer o administrador a "olhar para algo estranho" e eles têm acesso root.test
, como no título da pergunta (já quetest
é um shell embutido e provavelmente também já existe em algum lugar no seu$PATH
)..
será preenchido automaticamente para./
(digitar.
e pressionar Tab) pelo menos nos shells modernos do Bash; portanto, você não precisará usar umaPATH
solução complexa ou insegura (como modificação).Se não for concluído automaticamente, pode ser necessário instalar o pacote "bash-complete".
fonte
.
possui vários candidatos à conclusão:.
(dir atual),..
(dir pai), o.
comando (que o bash fornece um alias fora do padrãosource
) e quaisquer arquivos de ponto presentes. Talvez obash-completion
pacote ignore isso; Eu acho isso atrozmente irritante (por exemplo, torna impossível completar os nomes de diretórios em umamake
linha de comando e geralmente é horrível com makefiles cheios de regras implícitas), por isso eu sempre limpo.make
alvos.É possível escrever essa função:
no seu
~/.bashrc
. Então você poderá executar emp app arguments
vez de./app arguments
. Esta solução funciona para executáveis de qualquer tipo, incluindo scripts e binários."$@"
expande para uma lista de argumentos passados adequadamente para a função (preservando todos os caracteres especiais da expansão glob ou variável) e, como apontado pelo @Scott,bash
é inteligente o suficiente para acrescentar./
ao primeiro deles, preservando o restante.fonte
strace -f p app
de ver as chamadas do sistema feitas ou$(which time) p app
de quanto tempo leva.p
como um script executável funcionaria melhor nesses dois exemplos específicos que inventei. Nenhuma solução poderia funcionarldd p app
, emboraldd
também seja diferente ao exigir um caminho completo, talvez por razões como essa.p app args
com./app args
de uma forma que é invisível a qualquer um exigiria tubulação de entrada shell através de algum tipo de pré-processamento e iria causar todos os tipos de diversão quando a substituição ocorre em um lugar não intencional :)$@
? Caso contrário, ele passará apenas um grande argumento para o programa.$@
é uma matriz. Quando expandidos"
, cada parâmetro se expande para uma palavra separada.$*
se comporta do jeito que você está pensando.p() { ./"$@"; }
é tudo que você precisa.Você poderia colocar
.
a sua$PATH
adicionando por exemplo,PATH=$PATH:.
para o seu/etc/profile
, desta forma você pode executarfile
apenas por escritofile
, a menos que seja em alguma outra pasta no seu caminho (por exemplo/usr/bin/
). Observe que isso geralmente não é uma boa ideia.Por que é ruim: diga que você está em uma situação em que não confia totalmente no conteúdo de um diretório - você o baixou de algum lugar desonesto e deseja investigá-lo antes de executá-lo, ou é um administrador de sistemas ajudando alguns procurando o diretório inicial, etc. Você deseja listar o diretório e tentar digitar ls, mas, oops, você digitou um erro de digitação e acabou digitando sl. O autor deste diretório malicioso antecipou isso e colocou um script de shell chamado "sl", que executa 'rm -rf --no-preserve-root /' (ou algo mais malicioso como instalar um rootkit).
(Obrigado @Muzer pela explicação)
fonte
Você pode ligar para o intérprete, por exemplo
Nesse caso, o script será executado mesmo que não tenha uma linha shebang (por exemplo
#!/bin/bash
) nem um bit executável. Você precisará conhecer o intérprete correto para executá-lo também. Você pode ler a linha shebang do arquivo primeiro para certificar-se de ligar para o intérprete correto, por exemplo, se a linha shebang indicarvocê ligaria
fonte
/lib/ld.so
Até onde eu sei, não há como alcançá-lo, a menos que você inclua o arquivo no caminho env, portanto, você pode executá-lo apenas digitando:
file
.file
não funcionará, pois esse é um nome de arquivo diferente. É um arquivo chamado.file
e não./file
.Sinto que a barra pode ser difícil de digitar para você, porque o layout não está em inglês, talvez? Nesse caso, isso também acontece comigo; portanto, frequentemente troco o layout do meu teclado para o inglês pressionando Alt + Shift no Windows (eu uso o Linux do ssh)
fonte
As pessoas sugeriram a adição
.
dePATH
, o que é perigoso porque cria o risco de você acidentalmente executar um programa malicioso plantado em um diretório gravável em todo o mundo. Mas, se você tem programas executáveis em alguns diretórios que você possui e são gravável apenas por você, então é seguro (bastante seguro?) Para colocar aqueles diretor (es) emPATH
, adicionando uma linha comopara o seu
~/.bashrc
arquivo. Claro que isso significa que você pode executar um programa em um desses diretórios de qualquer lugar do sistema de arquivos. Por exemplo, você poderiacd /etc
digitarfoo
e ele seria executado~/dev/myprog1/foo
. Isso tem a pequena desvantagem de que você não pode ter programas com o mesmo nome em mais de um dos diretórios. Especificamente, se você tiver programas chamadosfoo
em ambos~/dev/myprog1
e~/dev/myprog2
, não poderá executar o segundo, exceto especificando um caminho. Da mesma forma, se você tem um~/dev/myprog1/cat
- mas por que você gostaria?Outra abordagem, se você tiver apenas alguns programas com isso, é definir aliases para eles:
Ou você pode chamar os apelidos
.gizmo
e,.gonzo
se achar mais intuitivo.Na verdade, isso tem, até certo ponto, o mesmo risco de segurança que você coloca
.
no seuPATH
. Se um usuário mal-intencionado puder ler seu.bashrc
e ver seus aliases, ele poderá colocar o malware chamadogizmo
egonzo
em diretórios aleatórios na esperança de que você o execute. É melhor usar esses nomes de caminho absolutos:A propósito, você deve evitar nomear um executável
test
, porque esse é um comando interno do shell, e você pode executar um programa com esse nome apenas especificando um caminho ou algum outro truque.fonte
make gizmo
oumake gonzo
.Makefile
em cada diretório, para que as açõesmake gizmo
terminem em execuçãogizmo
? (1) Essa parece uma maneira incômoda de fazer a mesma coisa que ap
função, sugerida na pergunta, inicialmente implementada pela aitap e refinada por Scott. (2) Você pode passar argumentos dessa maneira? ISTMmake gizmo arg1 arg2
equivalente amake gizmo; make arg1; make arg2
../
em todos os diretórios . Na minha opinião, ele está desenvolvendo algo e só precisa executar o programa produzido com./file
frequência. Eu realmente não consigo pensar em qualquer outro cenário onde seria frequentemente precisam executar um arquivo local e se ele não estiver sendo executado com frequência ele não iria se preocupar fazer a pergunta (ele disse difícil não impossível ) (2) não é realmente mas você pode passar os argumentos na receita.Para expandir a resposta de Zanna sobre intérpretes (desculpe, sem repetições para comentar): um "intérprete" para executáveis nativos (também conhecidos como arquivos binários ELF) é o loader dinâmico (
ld.so
), mas normalmente não entende a sintaxe que você deseja:(também, a menos que você faça um link simbólico
ld.so
para o caminho, você ainda precisará escrever/
s)fonte
binfmt_misc
é para isso./libexec/ld-elf.so.1
. No Linux, não é tão simples quanto "decidir como executar um binário":binfmt_misc
detecta o formato do arquivo por números mágicos (ELF, script shebang, CIL). Depois disso, obinfmt_elf
manipulador é chamado. Ele analisa cabeçalhos e seções do ELF;.interp
seção contém o caminho do carregador dinâmico; esse carregador é iniciado pelo kernel, realoca e pula para_start
. No FreeBSD (não tenho certeza sobre os outros), não há binfmt, mas o princípio é +/- semelhante.ld.so
não possui.interp
e está vinculado estaticamente, o que significa que não é necessário outro vinculador / carregador dinâmico para resolver seus símbolos externos e fazer cálculos de relocação.Se pudermos começar a configurar as coisas
As distribuições mais modernas incluem ~ / .local / bin no $ PATH (adicione
export PATH="$HOME/.local/bin:$PATH"
ao seu~/.profile
se o seu não for o caso). Então você pode usarx file
para executar./file
.Não tente definir um
.
comando. O comando. script
já é executadoscript
no shell atual. Isso permitescript
definir variáveis de ambiente para o shell atual.fonte
exec "$@"
.$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
shift $1
; apenasexec ./"$@"
. (2) Como você está falando de um script de shell, é um pouco inútil / enganoso aconselhar as pessoas a não definirem um.
comando, pois é impossível criar um arquivo chamado.
. (É possível, e muito aconselhável, para definir uma função alias ou concha chamado.
.)Se pudermos criar scripts auxiliares, você poderá criar um auxiliar que adicione o pwd ao PATH e execute
Isso evita adicionar "." ao caminho e poluindo seu .profile com todos os caminhos em que você possa, em algum momento, querer executar algo.
Podemos levar essa abordagem um passo adiante, criando um auxiliar que lança um novo shell com um PATH modificado. Se usar um diretório como parâmetro (usando o pwd como padrão), ele funcionará como um
pushd
que edita o caminho. Você pode estar ciente de que quaisquer alterações em outras variáveis de ambiente seriam perdidas ao sair do subshell, mas em um shell de longa execução, sua variável PATH não ficará confusa. Dependendo dos seus fluxos de trabalho, isso pode ser vantajoso.Mas acho que se você quisesse rodar com ele, poderia hackear
pushd
epopd
assim eles podem fazer as mesmas modificações no caminho sem fazer um subshell que perderá outras alterações.(Você não pode fazer o mesmo
cd
porque não possui um análogopopd
.)Você também pode criar um par de ajudantes dedicados para pressionar e abrir as entradas PATH. O que funciona melhor realmente depende dos seus padrões de uso.
fonte
cd
, mas está mais lá fora: Crie um arquivo como.dircmds
e hackearcd
para tornar os comandos definidos em./.dircmds
indisponíveis logo antes da troca e disponíveis logo após a troca.Você pode usar a
. script.sh
sintaxe enquanto o script que você deseja executar estiver no diretório atual.Você também pode prefixar o intérprete, como sh ou bash. exemplo:
bash script.sh
fonte
. script.sh
irá quebrar se o script contiverexit
, tiver efeitos inesperados, por exemplo, se redefinir PATH "temporariamente"; ele também funciona apenas para scripts para o seu shell atualexit
você pode colocá-lo entre parênteses, ou seja, um subshell, mas é verdade, ainda seria apenas para scripts no mesmo shell.