Почему neovim не видит мой скрипт Python в режиме командной строки?

Для своих целей я написал два простых скрипта — 1 скрипт на bash и 1 скрипт на Python. Ниже я их прикрепил.

Баш:

#!/bin/bash

cat $1 | xclip -selection clipboard

Питон:

#!/usr/bin/python3

import sys
import os

PATH = '/home/gipakrot/sql/sql_ex/solutions'

files = os.listdir(PATH)

current_file = sys.argv[1]

if current_file in files:
    version = 1
    task = current_file[2: current_file.find('.sql')]
    for file in files:
        if file.startswith(f'ex{task}_'):
            version += 1
    final_name = f'ex{task}_{version}.sql'

else:
    final_name = current_file

with open(current_file, 'r') as f:
    lines = f.readlines()

with open(f'{PATH}/{final_name}', 'a') as f:
    for line in lines:
        f.write(line)

Также я сделал псевдонимы для них обоих:

alias movesql='mvsql.py'
alias copysql='copysql.sh'

Я хочу использовать их в режиме командной строки neovim.

Когда я пытаюсь использовать эти сценарии в режиме командной строки neovim:

:!copysql or :!movesql

Я получаю эту ошибку:

:!copysql [Command Line]                                                                                                      
/bin/bash: line 1: copysql: command not found

shell returned 127

Можете ли вы помочь мне решить эту проблему? Не вижу, что я делаю не так. В терминале оба скрипта (через псевдонимы) работают как положено.

. обычно нет в $PATH. Поместите сценарии в каталог $PATH или укажите абсолютный путь в псевдонимах.
Barmar 13.08.2024 21:51

К неовиму это не имеет никакого отношения. У вас возникла бы та же проблема, если бы вы ввели псевдоним в обычной командной строке.

Barmar 13.08.2024 21:52

Опытные пользователи создают каталог типа ~/bin и помещают туда свои личные скрипты. Затем добавьте этот каталог в $PATH в свой .profile.

Barmar 13.08.2024 21:54

@Barmar не будет работать из Vim, потому что :! будет запускать неинтерактивную оболочку и не просматривать .profile, если вы не настроите shellcmdflag, что, в свою очередь, само по себе создает проблемы.

Friedrich 13.08.2024 22:02

@Friedrich PATH обычно экспортируется, поэтому он будет унаследован всеми оболочками во время сеанса входа в систему. Так что вам нужно всего лишь установить его .profile.

Barmar 13.08.2024 22:03

@Бармар, да, PATH будет работать, псевдонимы нет. В вопросе ОП были псевдонимы, и я пропустил, что ваше предложение работает без них.

Friedrich 13.08.2024 22:14

Да, забыл об этом. Вам следует просто выполнить сценарии Python и оболочки напрямую, не используя псевдонимы. Если вы не хотите вводить расширения .py и .sh, вы можете исключить их из имен файлов скриптов.

Barmar 13.08.2024 22:17

В любом случае, речь не идет о программировании. Вопросы об интерактивном использовании Unix относятся к разделу Unix и Linux.

Barmar 13.08.2024 22:18

У меня нет проблем, когда я набираю их в обычной командной строке, они работают ожидаемо. Но спасибо вам обоим! Я поместил оба скрипта в ~/.local/bin без расширений и под теми именами, которые хочу, чтобы они использовали, и они работают в оболочке и в neovim.

Gipakrot 14.08.2024 01:35

Чтобы усовершенствовать свое решение, вы можете размещать свои сценарии где угодно и с любыми именами. Затем создайте символические ссылки без расширений в каталоге PATH.

Friedrich 14.08.2024 10:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это связано с тем, что оболочка, предоставляемая через интерфейс :! в neovim, не является интерактивной оболочкой. Мы можем убедиться в этом через :!echo $-. Полученная строка символов не включает i. В результате псевдонимы (и функции) не будут загружены. Хорошей альтернативой будет символическая ссылка этих двух скриптов на ~/.local/bin, что является обычным местом для пользовательских скриптов. В зависимости от того, в каком дистрибутиве вы находитесь, этот каталог может быть или не быть в вашей переменной среды PATH, поэтому проверьте, и добавьте его в свой .bashrc или другой сценарий инициализации, если нет. Обратите внимание, что точное имя символической ссылки — это то, что вы будете вызывать для выполнения скрипта, поэтому рассмотрите ln -s mvsql.py ~/.local/bin/mvsql (или что-то еще короче, если вы собираетесь использовать ее часто), чтобы вам не приходилось включать .py при вызове. это.

Другие вопросы по теме