Lua изменить текущий / рабочий каталог, Linux (без LFS или каких-либо нестандартных модулей) - PullRequest
1 голос
/ 19 декабря 2011

Мне нужно изменить текущий рабочий каталог в скрипте lua для выполнения определенных действий, но у меня возникла проблема с этой простой задачей. Я пишу тестовый скрипт test.lua:

os.execute("cd /usr")
os.execute("ls")

Но вывод lua test.lua:

test.lua

Текущий каталог не меняется. Что не так? И я не могу использовать LFS или любые не стандартные модули.


Спасибо всем за разъяснение ситуации. Я выбираю другой способ: изменить рабочий каталог перед запуском скрипта lua, но у меня много проблем с путями, которые используются в скриптах и ​​со скриптами.

Ответы [ 5 ]

2 голосов
/ 19 декабря 2011

В Unix os.execute() порождает дочерний процесс и его дочерние элементы.В ответе jpjacobs первый процесс будет выполнять оболочку.

Операция изменения каталога влияет только на дочерний процесс, а не на процесс, в котором интерпретатор Lua выполняет вашу программу.

2 голосов
/ 19 декабря 2011

Стандартная библиотека Lua должна быть как маленькой, так и переносимой.Следовательно, он основан на возможностях стандартной библиотеки C для всех функций, кроме нескольких.У него нет функции для изменения каталогов;вот почему такие библиотеки, как LFS существуют .

Считаете ли вы, что Lua может не подходить для ваших нужд?Если вы выполняете сценарии в стиле оболочки в среде, где вам не разрешено загружать нестандартные модули, возможно, Python или Perl подойдут вам лучше.Обе они имеют обширные стандартные библиотеки с множеством функций, и все это без необходимости загружать нестандартные модули.

Если вы хотите создавать настоящие сценарии в стиле оболочки на Lua, вам нужны модули.Это так просто.Поэтому вы должны либо использовать внешние модули, либо использовать другой язык.

2 голосов
/ 19 декабря 2011

Это просто невозможно без внешних библиотек. Вы можете использовать такие вещи, как

os.execute("cd /usr/ && ls")
1 голос
/ 20 декабря 2011

Это немного взломано, но вы пытались создать символические ссылки на нужные вам папки в текущей папке, поэтому вам вообще не нужно менять текущую папку?

os.execute("ln -s /usr/foo") -- link called "foo" in current dir
os.execute("ln -s /usr/bar") -- link called "bar" in current dir

baz = require('foo.baz') -- loading file /usr/foo/baz.lua
0 голосов
/ 28 августа 2018

Вот программа, написанная с использованием Zerobranie Lua 5.2 :

local sP = "E:/Documents/Lua-Projs/SVN/ScriptsWireE2"
local a, b, c = os.execute("cd "..sP.."&& dir")
print(a,b,c)

И одежда:

Програма 'lua.exe' пусната в 'E:\Documents\Lua-Projs\ZeroBraineIDE\ZeroBraineProjects' (pid: 8832).
 Volume in drive E is Data
 Volume Serial Number is DE34-ED00

 Directory of E:\Documents\Lua-Projs\SVN\ScriptsWireE2

08-03-2016  18:25    <DIR>          .
08-03-2016  18:25    <DIR>          ..
17-03-2016  18:15    <DIR>          Bridges
07-03-2016  18:21            11 558 license
07-03-2016  18:21                87 readme.md
               2 File(s)         11 645 bytes
               3 Dir(s)  181 729 161 216 bytes free
true    exit    0
Програмата завършена за 0.06 секунди (pid: 8832).
...