Как передать путь из команды чтения оболочки в wslpath

Я пытаюсь написать сценарий, который будет передавать местоположение каталога, перетащенного в окно bash, с помощью инструмента wslpath при работе в WSL в Windows.

# Drag and drop the directory into the Bash window
IFS = "" read -r input
echo;

# If system is Windows Subsystem for Linux convert Windows paths to Unix paths
if [[ $(uname -r) =~ Microsoft$ ]]; then
    input = "$( wslpath "$input" )"
fi

# Use eval to parse spaces in the path as an array
eval "input=( $input )"

# List files and directories
ls -l "${input}"; echo;

Если в имени каталога есть пробелы, он не может найти каталог для списка.

Если я перемещаю строку eval "input=( $input )" над условной подсистемой Windows для Linux, она находит каталог, если в имени каталога есть пробел, но не находит, если пробела нет.

Если я заменю строку input = "$( wslpath "$input" )" следующим выражением замены Bash, оно будет работать с пробелами или без них, но буква диска должна быть жестко закодирована input=${input/F:\//mnt/f/}

Я прочитал несколько потоков о порядке оценки кавычек в Bash, передаче аргументов функциям в виде массивов, а затем расширении этих массивов, но я действительно борюсь с этим, и я просто не могу заставить его работа.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
639
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку у вас есть только один путь, вам не нужны массивы. Пробелы внутри путей обрабатываются правильно, пока вы указываете свои переменные.

Actually, splitting the path into an array of words would cause information loss. You would not know if the array (a b) was originally a b (one space) or a b (two spaces). Also, you don't need eval to split a variable into words. array=($var) is the way to go.

Проблема здесь в том, что Windows вставляет пути с пробелами, заключая их в двойные кавычки. То есть, если вы перетащите C:\a, вы получите строку C:\a, а если перетащите C:\a b, вы получите "C:\a b". Эти кавычки не интерпретируются bash, поскольку они являются только входными данными, а не частью вашего скрипта. wslpath также не интерпретирует эти цитаты. Вместо этого wslpath '"C:\a b"' ищет файл с буквальным именем a b", находящийся на диске "C:. Мы должны вручную удалить кавычки, вставленные перетаскиванием Windows.

IFS= read -r input; echo
if [[ "$(uname -r)" =~ Microsoft$ ]]; then
    # is path quoted and contains a space?
    if [[ "$input" =~ ^\"(.*\ .*)\"$ ]]; then
      # remove quotes
      input = "${BASH_REMATCH[1]}"
    fi
    input = "$( wslpath "$input" )"
fi
ls -l "${input}"; echo

Он работает отлично! Большое спасибо. Я потратил целый день на гугление проблемы и пытался понять ее, и вы единственный человек, который четко объяснил причину.

edwinbradford 21.12.2020 18:24

Очень рад, что смог помочь.

Socowi 21.12.2020 19:13

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