From 544dc85e6f6df1015a63105136acade010465530 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 28 Jul 2024 19:48:24 +0000 Subject: [PATCH] Script rework --- .../app/browser/fs/OpenFileSystemComp.java | 8 + .../xpipe/app/comp/store/StoreEntryComp.java | 4 +- .../app/comp/store/StoreEntryWrapper.java | 2 +- .../java/io/xpipe/app/ext/ActionProvider.java | 11 +- .../io/xpipe/app/ext/DataStoreProvider.java | 4 - .../app/ext/EnabledParentStoreProvider.java | 2 +- .../java/io/xpipe/core/process/OsType.java | 2 +- .../ext/base/action/EditStoreAction.java | 6 - .../ext/base/action/RunScriptActionMenu.java | 156 ++++++++++++++++++ .../browser/MultiExecuteSelectionAction.java | 77 +++++++++ .../base/desktop/DesktopEnvironmentStore.java | 4 +- .../base/script/PredefinedScriptStore.java | 12 +- .../ext/base/script/RunScriptAction.java | 134 ++++++++------- .../ext/base/script/ScriptGroupStore.java | 3 +- .../ext/base/script/ScriptHierarchy.java | 94 +++++++++++ .../io/xpipe/ext/base/script/ScriptStore.java | 50 +++--- .../ext/base/script/SimpleScriptStore.java | 37 +++-- .../script/SimpleScriptStoreProvider.java | 15 +- .../ext/base/service/ServiceOpenAction.java | 2 +- ext/base/src/main/java/module-info.java | 1 + .../ext/base/resources/scripts/apt_update.sh | 1 - .../ext/base/resources/scripts/apt_upgrade.sh | 1 + .../xpipe/ext/base/resources/scripts/diff.sh | 1 + lang/base/strings/translations_da.properties | 3 +- lang/base/strings/translations_de.properties | 3 +- lang/base/strings/translations_en.properties | 3 +- lang/base/strings/translations_es.properties | 3 +- lang/base/strings/translations_fr.properties | 3 +- lang/base/strings/translations_it.properties | 3 +- lang/base/strings/translations_ja.properties | 3 +- lang/base/strings/translations_nl.properties | 3 +- lang/base/strings/translations_pt.properties | 3 +- lang/base/strings/translations_ru.properties | 3 +- lang/base/strings/translations_tr.properties | 3 +- lang/base/strings/translations_zh.properties | 3 +- lang/base/texts/executionType_da.md | 60 ++++--- lang/base/texts/executionType_de.md | 52 +++--- lang/base/texts/executionType_en.md | 38 +++-- lang/base/texts/executionType_es.md | 58 ++++--- lang/base/texts/executionType_fr.md | 50 +++--- lang/base/texts/executionType_it.md | 58 ++++--- lang/base/texts/executionType_ja.md | 62 ++++--- lang/base/texts/executionType_nl.md | 50 +++--- lang/base/texts/executionType_pt.md | 60 ++++--- lang/base/texts/executionType_ru.md | 60 ++++--- lang/base/texts/executionType_tr.md | 50 +++--- lang/base/texts/executionType_zh.md | 60 ++++--- 47 files changed, 908 insertions(+), 413 deletions(-) create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteSelectionAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/script/ScriptHierarchy.java delete mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_upgrade.sh create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/diff.sh diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java index e822892a2..145158c02 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java +++ b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java @@ -142,6 +142,14 @@ public class OpenFileSystemComp extends SimpleComp { } keyEvent.consume(); }); + InputHelper.onKeyCombination( + root, new KeyCodeCombination(KeyCode.BACK_SPACE), true, keyEvent -> { + var p = model.getCurrentParentDirectory(); + if (p != null) { + model.cdAsync(p.getPath()); + } + keyEvent.consume(); + }); return root; } diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java index 449880493..94f33ba3d 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java @@ -265,7 +265,7 @@ public abstract class StoreEntryComp extends SimpleComp { button.apply(new ContextMenuAugment<>( mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, keyEvent -> false, () -> { var cm = ContextMenuHelper.create(); - branch.getChildren().forEach(childProvider -> { + branch.getChildren(getWrapper().getEntry().ref()).forEach(childProvider -> { var menu = buildMenuItemForAction(childProvider); if (menu != null) { cm.getItems().add(menu); @@ -460,7 +460,7 @@ public abstract class StoreEntryComp extends SimpleComp { Menu menu = item instanceof Menu m ? m : null; if (branch != null) { - var items = branch.getChildren().stream() + var items = branch.getChildren(getWrapper().getEntry().ref()).stream() .map(c -> buildMenuItemForAction(c)) .toList(); menu.getItems().addAll(items); diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java index e43a39b82..294cac4f2 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java @@ -204,7 +204,7 @@ public class StoreEntryWrapper { if (branch != null && entry.getStore() != null && branch.getApplicableClass().isAssignableFrom(entry.getStore().getClass())) { - return branch.getChildren().stream().anyMatch(child -> { + return branch.getChildren(entry.ref()).stream().anyMatch(child -> { return showActionProvider(child); }); } diff --git a/app/src/main/java/io/xpipe/app/ext/ActionProvider.java b/app/src/main/java/io/xpipe/app/ext/ActionProvider.java index 35a2a7fcd..117a6db55 100644 --- a/app/src/main/java/io/xpipe/app/ext/ActionProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/ActionProvider.java @@ -121,7 +121,11 @@ public interface ActionProvider { interface BranchDataStoreCallSite extends DataStoreCallSite { - List getChildren(); + default boolean isDynamicallyGenerated(){ + return false; + } + + List getChildren(DataStoreEntryRef store); } interface LeafDataStoreCallSite extends DataStoreCallSite { @@ -146,8 +150,9 @@ public interface ActionProvider { .toList()); var menuProviders = ALL.stream() - .map(actionProvider -> actionProvider.getBranchDataStoreCallSite() != null - ? actionProvider.getBranchDataStoreCallSite().getChildren() + .map(actionProvider -> actionProvider.getBranchDataStoreCallSite() != null && + !actionProvider.getBranchDataStoreCallSite().isDynamicallyGenerated() + ? actionProvider.getBranchDataStoreCallSite().getChildren(null) : List.of()) .flatMap(List::stream) .toList(); diff --git a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java index 11b925604..6169cc37e 100644 --- a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java @@ -80,10 +80,6 @@ public interface DataStoreProvider { return List.of(); } - default boolean shouldEdit() { - return false; - } - default StoreEntryComp customEntryComp(StoreSection s, boolean preferLarge) { return StoreEntryComp.create(s, null, preferLarge); } diff --git a/app/src/main/java/io/xpipe/app/ext/EnabledParentStoreProvider.java b/app/src/main/java/io/xpipe/app/ext/EnabledParentStoreProvider.java index 21911e239..d1f1e59e8 100644 --- a/app/src/main/java/io/xpipe/app/ext/EnabledParentStoreProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/EnabledParentStoreProvider.java @@ -14,7 +14,7 @@ public interface EnabledParentStoreProvider extends DataStoreProvider { @Override default StoreEntryComp customEntryComp(StoreSection sec, boolean preferLarge) { - if (sec.getWrapper().getValidity().getValue() != DataStoreEntry.Validity.COMPLETE) { + if (sec.getWrapper().getValidity().getValue() == DataStoreEntry.Validity.LOAD_FAILED) { return StoreEntryComp.create(sec, null, preferLarge); } diff --git a/core/src/main/java/io/xpipe/core/process/OsType.java b/core/src/main/java/io/xpipe/core/process/OsType.java index 5a07ab29b..0f11c601b 100644 --- a/core/src/main/java/io/xpipe/core/process/OsType.java +++ b/core/src/main/java/io/xpipe/core/process/OsType.java @@ -152,7 +152,7 @@ public interface OsType { public List determineInterestingPaths(ShellControl pc) throws Exception { var home = getHomeDirectory(pc); return List.of( - home, FileNames.join(home, "Downloads"), FileNames.join(home, "Documents"), "/etc", "/tmp", "/var"); + home, "/home", FileNames.join(home, "Downloads"), FileNames.join(home, "Documents"), "/etc", "/tmp", "/var"); } @Override diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/EditStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/EditStoreAction.java index f01d8e95a..806e9eb60 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/action/EditStoreAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/action/EditStoreAction.java @@ -32,12 +32,6 @@ public class EditStoreAction implements ActionProvider { return DataStore.class; } - @Override - public boolean isMajor(DataStoreEntryRef o) { - var provider = o.get().getProvider(); - return provider.shouldEdit(); - } - @Override public ObservableValue getName(DataStoreEntryRef store) { return AppI18n.observable("base.edit"); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java b/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java new file mode 100644 index 000000000..5883c813c --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java @@ -0,0 +1,156 @@ +package io.xpipe.ext.base.action; + +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.ext.ActionProvider; +import io.xpipe.app.storage.DataStoreEntryRef; +import io.xpipe.app.util.TerminalLauncher; +import io.xpipe.core.process.ShellStoreState; +import io.xpipe.core.store.ShellStore; +import io.xpipe.ext.base.script.ScriptHierarchy; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.ObservableValue; +import lombok.Value; + +import java.util.List; + +public class RunScriptActionMenu implements ActionProvider { + + @Value + private static class ScriptAction implements ActionProvider { + + ScriptHierarchy hierarchy; + + @Value + private class Action implements ActionProvider.Action { + + DataStoreEntryRef shellStore; + + @Override + public void execute() throws Exception { + try (var sc = shellStore.getStore().control().start()) { + var script = hierarchy.getLeafBase().getStore().assembleScriptChain(sc); + TerminalLauncher.open( + shellStore.getEntry(), + hierarchy.getLeafBase().get().getName() + " - " + shellStore.get().getName(), + null, + sc.command(script)); + } + } + } + + @Override + public LeafDataStoreCallSite getLeafDataStoreCallSite() { + if (!hierarchy.isLeaf()) { + return null; + } + + return new LeafDataStoreCallSite() { + @Override + public Action createAction(DataStoreEntryRef store) { + return new Action(store); + } + + @Override + public ObservableValue getName(DataStoreEntryRef store) { + return new SimpleStringProperty(hierarchy.getBase().get().getName()); + } + + @Override + public String getIcon(DataStoreEntryRef store) { + return "mdi2p-play-box-multiple-outline"; + } + + @Override + public Class getApplicableClass() { + return ShellStore.class; + } + }; + } + + public BranchDataStoreCallSite getBranchDataStoreCallSite() { + if (hierarchy.isLeaf()) { + return null; + } + + return new BranchDataStoreCallSite() { + + @Override + public Class getApplicableClass() { + return ShellStore.class; + } + + @Override + public ObservableValue getName(DataStoreEntryRef store) { + return new SimpleStringProperty(hierarchy.getBase().get().getName()); + } + + @Override + public boolean isDynamicallyGenerated() { + return true; + } + + @Override + public String getIcon(DataStoreEntryRef store) { + return "mdi2p-play-box-multiple-outline"; + } + + @Override + public List getChildren(DataStoreEntryRef store) { + return hierarchy.getChildren().stream().map(c -> new ScriptAction(c)).toList(); + } + }; + } + } + + @Override + public BranchDataStoreCallSite getBranchDataStoreCallSite() { + return new BranchDataStoreCallSite() { + + @Override + public Class getApplicableClass() { + return ShellStore.class; + } + + @Override + public boolean isMajor(DataStoreEntryRef o) { + return true; + } + + @Override + public ObservableValue getName(DataStoreEntryRef store) { + return AppI18n.observable("runScript"); + } + + @Override + public boolean isDynamicallyGenerated() { + return true; + } + + @Override + public String getIcon(DataStoreEntryRef store) { + return "mdi2p-play-box-multiple-outline"; + } + + @Override + public List getChildren(DataStoreEntryRef store) { + var state = store.getEntry().getStorePersistentState(); + if (!(state instanceof ShellStoreState shellStoreState) || shellStoreState.getShellDialect() == null) { + return List.of(); + } + + var hierarchy = ScriptHierarchy.buildEnabledHierarchy(ref -> { + if (!ref.getStore().isRunnableScript()) { + return false; + } + + if (!ref.getStore().isCompatible(shellStoreState.getShellDialect())) { + return false; + } + + return true; + }); + return hierarchy.getChildren().stream().map(c -> new ScriptAction(c)).toList(); + } + }; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteSelectionAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteSelectionAction.java new file mode 100644 index 000000000..ee166754e --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteSelectionAction.java @@ -0,0 +1,77 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.action.BranchAction; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.browser.file.BrowserEntry; +import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.app.util.TerminalLauncher; +import io.xpipe.core.process.CommandBuilder; +import io.xpipe.core.process.ShellControl; +import javafx.beans.value.ObservableValue; + +import java.util.List; + +public abstract class MultiExecuteSelectionAction implements BranchAction { + + protected abstract CommandBuilder createCommand(ShellControl sc, OpenFileSystemModel model, List entries); + + protected abstract String getTerminalTitle(); + + @Override + public List getBranchingActions(OpenFileSystemModel model, List entries) { + return List.of( + new LeafAction() { + + @Override + public void execute(OpenFileSystemModel model, List entries) { + model.withShell( + pc -> { + var cmd = pc.command(createCommand(pc, model, entries)); + TerminalLauncher.open( + model.getEntry().getEntry(), + getTerminalTitle(), + model.getCurrentDirectory() != null + ? model.getCurrentDirectory() + .getPath() + : null, cmd); + }, + false); + } + + @Override + public ObservableValue getName(OpenFileSystemModel model, List entries) { + var t = AppPrefs.get().terminalType().getValue(); + return AppI18n.observable( + "executeInTerminal", + t != null ? t.toTranslatedString().getValue() : "?"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return AppPrefs.get().terminalType().getValue() != null; + } + }, + new LeafAction() { + + @Override + public void execute(OpenFileSystemModel model, List entries) { + model.withShell( + pc -> { + var cmd = createCommand(pc, model, entries); + pc.command(cmd) + .withWorkingDirectory(model.getCurrentDirectory() + .getPath()) + .execute(); + }, + false); + } + + @Override + public ObservableValue getName(OpenFileSystemModel model, List entries) { + return AppI18n.observable("executeInBackground"); + } + }); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopEnvironmentStore.java b/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopEnvironmentStore.java index f0f86d8ae..e173422eb 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopEnvironmentStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopEnvironmentStore.java @@ -51,10 +51,10 @@ public class DesktopEnvironmentStore extends JacksonizedValue var f = ScriptStore.flatten(scripts); var filtered = f.stream() .filter(simpleScriptStore -> - simpleScriptStore.getMinimumDialect().isCompatibleTo(dialect)) + simpleScriptStore.getStore().getMinimumDialect().isCompatibleTo(dialect)) .toList(); var initCommands = new ArrayList<>(filtered.stream() - .map(simpleScriptStore -> simpleScriptStore.getCommands()) + .map(simpleScriptStore -> simpleScriptStore.getStore().getCommands()) .toList()); if (initScript != null) { initCommands.add(initScript); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java index 8d8e043de..ecda4e865 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java @@ -61,17 +61,25 @@ public enum PredefinedScriptStore { .commands(file("starship_powershell.ps1")) .initScript(true) .build()), - APT_UPDATE("Apt update", () -> SimpleScriptStore.builder() + APT_UPDATE("Apt upgrade", () -> SimpleScriptStore.builder() .group(PredefinedScriptGroup.MANAGEMENT.getEntry()) .minimumDialect(ShellDialects.SH) - .commands(file(("apt_update.sh"))) + .commands(file(("apt_upgrade.sh"))) .shellScript(true) + .runnableScript(true) .build()), REMOVE_CR("CRLF to LF", () -> SimpleScriptStore.builder() .group(PredefinedScriptGroup.FILES.getEntry()) .minimumDialect(ShellDialects.SH) .commands(file(("crlf_to_lf.sh"))) .fileScript(true) + .shellScript(true) + .build()), + DIFF("Diff", () -> SimpleScriptStore.builder() + .group(PredefinedScriptGroup.FILES.getEntry()) + .minimumDialect(ShellDialects.SH) + .commands(file(("diff.sh"))) + .fileScript(true) .build()); private final String name; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java index 3154f39cd..64a30b3b3 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java @@ -6,19 +6,17 @@ import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.browser.session.BrowserSessionModel; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.ScriptHelper; import io.xpipe.core.process.CommandBuilder; import io.xpipe.core.process.ShellControl; -import io.xpipe.ext.base.browser.MultiExecuteAction; +import io.xpipe.ext.base.browser.MultiExecuteSelectionAction; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; import javafx.scene.Node; import org.kordamp.ikonli.javafx.FontIcon; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; public class RunScriptAction implements BrowserAction, BranchAction { @@ -39,66 +37,82 @@ public class RunScriptAction implements BrowserAction, BranchAction { @Override public boolean isApplicable(OpenFileSystemModel model, List entries) { - var sc = model.getFileSystem().getShell().orElseThrow(); return model.getBrowserModel() instanceof BrowserSessionModel - && !getInstances(sc).isEmpty(); - } - - private Map getInstances(ShellControl sc) { - var scripts = ScriptStore.flatten(ScriptStore.getDefaultEnabledScripts()); - var map = new LinkedHashMap(); - for (SimpleScriptStore script : scripts) { - if (!script.isFileScript()) { - continue; - } - - if (!script.isCompatible(sc)) { - continue; - } - - var entry = DataStorage.get().getStoreEntryIfPresent(script, true); - if (entry.isPresent()) { - map.put(entry.get().getName(), script); - } - } - return map; + && !createActionForScriptHierarchy(model, entries).isEmpty(); } @Override - public List getBranchingActions(OpenFileSystemModel model, List entries) { - var sc = model.getFileSystem().getShell().orElseThrow(); - var scripts = getInstances(sc); - List actions = scripts.entrySet().stream() - .map(e -> { - return new MultiExecuteAction() { - - @Override - public ObservableValue getName(OpenFileSystemModel model, List entries) { - return new SimpleStringProperty(e.getKey()); - } - - @Override - protected CommandBuilder createCommand(ShellControl sc, OpenFileSystemModel model, BrowserEntry entry) { - if (!(model.getBrowserModel() instanceof BrowserSessionModel bm)) { - return null; - } - - var content = e.getValue().assemble(sc); - var script = ScriptHelper.createExecScript(sc, content); - var builder = CommandBuilder.of().add(sc.getShellDialect().runScriptCommand(sc, script.toString())); - entries.stream() - .map(browserEntry -> browserEntry - .getRawFileEntry() - .getPath()) - .forEach(s -> { - builder.addFile(s); - }); - return builder; - } - }; - }) - .map(leafAction -> (BranchAction) leafAction) - .toList(); + public List getBranchingActions(OpenFileSystemModel model, List entries) { + var actions = createActionForScriptHierarchy(model, entries); return actions; } + + private List createActionForScriptHierarchy(OpenFileSystemModel model, List selected) { + var sc = model.getFileSystem().getShell().orElseThrow(); + var hierarchy = ScriptHierarchy.buildEnabledHierarchy(ref -> { + if (!ref.getStore().isFileScript()) { + return false; + } + + if (!ref.getStore().isCompatible(sc)) { + return false; + } + return true; + }); + return createActionForScriptHierarchy(model, hierarchy).getBranchingActions(model, selected); + } + + private BranchAction createActionForScriptHierarchy(OpenFileSystemModel model, ScriptHierarchy hierarchy) { + if (hierarchy.isLeaf()) { + return createActionForScript(model, hierarchy.getLeafBase()); + } + + var list = hierarchy.getChildren().stream().map(c -> createActionForScriptHierarchy(model, c)).toList(); + return new BranchAction() { + @Override + public List getBranchingActions(OpenFileSystemModel model, List entries) { + return list; + } + + @Override + public ObservableValue getName(OpenFileSystemModel model, List entries) { + var b = hierarchy.getBase(); + return new SimpleStringProperty(b != null ? b.get().getName() : null); + } + }; + } + + private BranchAction createActionForScript(OpenFileSystemModel model, DataStoreEntryRef ref) { + return new MultiExecuteSelectionAction() { + + @Override + public ObservableValue getName(OpenFileSystemModel model, List entries) { + return new SimpleStringProperty(ref.get().getName()); + } + + @Override + protected CommandBuilder createCommand(ShellControl sc, OpenFileSystemModel model, List selected) { + if (!(model.getBrowserModel() instanceof BrowserSessionModel)) { + return null; + } + + var content = ref.getStore().assembleScriptChain(sc); + var script = ScriptHelper.createExecScript(sc, content); + var builder = CommandBuilder.of().add(sc.getShellDialect().runScriptCommand(sc, script.toString())); + selected.stream() + .map(browserEntry -> browserEntry + .getRawFileEntry() + .getPath()) + .forEach(s -> { + builder.addFile(s); + }); + return builder; + } + + @Override + protected String getTerminalTitle() { + return ref.get().getName() + " - " + model.getName(); + } + }; + } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStore.java index c7578bd7b..f29e94c8b 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStore.java @@ -25,7 +25,7 @@ public class ScriptGroupStore extends ScriptStore implements GroupStore all) { + protected void queryFlattenedScripts(LinkedHashSet> all) { getEffectiveScripts().forEach(simpleScriptStore -> { simpleScriptStore.getStore().queryFlattenedScripts(all); }); @@ -35,6 +35,7 @@ public class ScriptGroupStore extends ScriptStore implements GroupStore> getEffectiveScripts() { var self = getSelfEntry(); return DataStorage.get().getDeepStoreChildren(self).stream() + .filter(entry -> entry.getValidity().isUsable()) .map(dataStoreEntry -> dataStoreEntry.ref()) .toList(); } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptHierarchy.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptHierarchy.java new file mode 100644 index 000000000..5a60690a9 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptHierarchy.java @@ -0,0 +1,94 @@ +package io.xpipe.ext.base.script; + +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreEntryRef; +import lombok.Value; + +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.function.Predicate; + +@Value +public class ScriptHierarchy { + + public static ScriptHierarchy buildEnabledHierarchy(Predicate> include) { + var all = new HashSet<>(ScriptStore.getEnabledScripts()); + + // Add individual children of groups + // This is not recursive + for (DataStoreEntryRef ref : new HashSet<>(all)) { + if (ref.getStore() instanceof ScriptGroupStore groupStore) { + all.addAll(groupStore.getEffectiveScripts()); + } + } + + // Add parents + for (DataStoreEntryRef ref : new HashSet<>(all)) { + var current = ref; + while (true) { + var parent = DataStorage.get().getDefaultDisplayParent(current.get()); + if (parent.isPresent()) { + all.add(parent.get().ref()); + current = parent.get().ref(); + } else { + break; + } + } + } + + var top = all.stream().filter(ref -> { + var parent = DataStorage.get().getDefaultDisplayParent(ref.get()); + return parent.isEmpty(); + }).toList(); + + var mapped = top.stream() + .map(ref -> buildHierarchy(ref, check -> { + if (!(check.getStore() instanceof SimpleScriptStore)) { + return true; + } + + if (!include.test(check.get().ref())) { + return false; + } + + return all.contains(check); + })) + .filter(hierarchy -> hierarchy.show()) + .sorted(Comparator.comparing(scriptHierarchy -> scriptHierarchy.getBase().get().getName().toLowerCase())) + .toList(); + return new ScriptHierarchy(null, mapped); + } + + public static ScriptHierarchy buildHierarchy(DataStoreEntryRef ref, Predicate> include) { + if (ref.getStore() instanceof ScriptGroupStore groupStore) { + var children = groupStore.getEffectiveScripts().stream().filter(include) + .map(c -> buildHierarchy(c, include)) + .filter(hierarchy -> hierarchy.show()) + .sorted(Comparator.comparing(scriptHierarchy -> scriptHierarchy.getBase().get().getName().toLowerCase())) + .toList(); + return new ScriptHierarchy(ref, children); + } else { + return new ScriptHierarchy(ref, List.of()); + } + } + + DataStoreEntryRef base; + List children; + + public boolean show() { + return isLeaf() || !isEmptyBranch(); + } + + public boolean isEmptyBranch() { + return (base == null || base.getStore() instanceof ScriptGroupStore) && children.isEmpty(); + } + + public boolean isLeaf() { + return base != null && base.getStore() instanceof SimpleScriptStore && children.isEmpty(); + } + + public DataStoreEntryRef getLeafBase() { + return base.get().ref(); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java index 7f5789d1e..dfcf0279e 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java @@ -34,7 +34,7 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, protected final String description; public static ShellControl controlWithDefaultScripts(ShellControl pc) { - return controlWithScripts(pc, getDefaultEnabledScripts()); + return controlWithScripts(pc, getEnabledScripts()); } public static ShellControl controlWithScripts( @@ -46,10 +46,10 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, } var initFlattened = flatten(enabledScripts).stream() - .filter(store -> store.isInitScript()) + .filter(store -> store.getStore().isInitScript()) .toList(); var bringFlattened = flatten(enabledScripts).stream() - .filter(store -> store.isShellScript()) + .filter(store -> store.getStore().isShellScript()) .toList(); // Optimize if we have nothing to do @@ -58,7 +58,7 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, } initFlattened.forEach(simpleScriptStore -> { - pc.withInitSnippet(simpleScriptStore); + pc.withInitSnippet(simpleScriptStore.getStore()); }); if (!bringFlattened.isEmpty()) { pc.withInitSnippet(new ShellInitCommand() { @@ -94,29 +94,20 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, } } - private static String initScriptsDirectory(ShellControl proc, List scriptStores) + private static String initScriptsDirectory(ShellControl proc, List> refs) throws Exception { - if (scriptStores.isEmpty()) { + if (refs.isEmpty()) { return null; } - var applicable = scriptStores.stream() + var applicable = refs.stream() .filter(simpleScriptStore -> - simpleScriptStore.getMinimumDialect().isCompatibleTo(proc.getShellDialect())) + simpleScriptStore.getStore().getMinimumDialect().isCompatibleTo(proc.getShellDialect())) .toList(); if (applicable.isEmpty()) { return null; } - var refs = applicable.stream() - .map(scriptStore -> { - return DataStorage.get().getStoreEntries().stream() - .filter(dataStoreEntry -> dataStoreEntry.getStore() == scriptStore) - .findFirst() - .map(entry -> entry.ref()); - }) - .flatMap(Optional::stream) - .toList(); var hash = refs.stream() .mapToInt(value -> value.get().getName().hashCode() + value.getStore().hashCode()) @@ -156,24 +147,25 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, return targetDir; } - public static List> getDefaultEnabledScripts() { + public static List> getEnabledScripts() { return DataStorage.get().getStoreEntries().stream() - .filter(dataStoreEntry -> dataStoreEntry.getStore() instanceof ScriptStore scriptStore + .filter(dataStoreEntry -> dataStoreEntry.getValidity().isUsable() && + dataStoreEntry.getStore() instanceof ScriptStore scriptStore && scriptStore.getState().isEnabled()) .map(DataStoreEntry::ref) .toList(); } - public static List flatten(List> scripts) { - var seen = new LinkedHashSet(); + public static List> flatten(List> scripts) { + var seen = new LinkedHashSet>(); scripts.forEach(scriptStoreDataStoreEntryRef -> scriptStoreDataStoreEntryRef.getStore().queryFlattenedScripts(seen)); - var dependencies = new HashMap>(); - seen.forEach(simpleScriptStore -> { - var f = new HashSet<>(simpleScriptStore.queryFlattenedScripts()); - f.remove(simpleScriptStore); - dependencies.put(simpleScriptStore, f); + var dependencies = new HashMap, Set>>(); + seen.forEach(ref -> { + var f = new HashSet<>(ref.getStore().queryFlattenedScripts()); + f.remove(ref); + dependencies.put(ref, f); }); var sorted = new ArrayList<>(seen); @@ -209,13 +201,13 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, // } } - SequencedCollection queryFlattenedScripts() { - var seen = new LinkedHashSet(); + SequencedCollection> queryFlattenedScripts() { + var seen = new LinkedHashSet>(); queryFlattenedScripts(seen); return seen; } - protected abstract void queryFlattenedScripts(LinkedHashSet all); + protected abstract void queryFlattenedScripts(LinkedHashSet> all); public abstract List> getEffectiveScripts(); } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java index 1896a7328..d1bb29ffa 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java @@ -10,6 +10,7 @@ import io.xpipe.core.process.ShellInitCommand; import io.xpipe.core.util.ValidationException; import com.fasterxml.jackson.annotation.JsonTypeName; +import io.xpipe.ext.base.SelfReferentialStore; import lombok.Getter; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; @@ -24,20 +25,25 @@ import java.util.stream.Collectors; @Getter @Jacksonized @JsonTypeName("script") -public class SimpleScriptStore extends ScriptStore implements ShellInitCommand.Terminal { +public class SimpleScriptStore extends ScriptStore implements ShellInitCommand.Terminal, SelfReferentialStore { private final ShellDialect minimumDialect; private final String commands; private final boolean initScript; private final boolean shellScript; private final boolean fileScript; + private final boolean runnableScript; public boolean isCompatible(ShellControl shellControl) { var targetType = shellControl.getOriginalShellDialect(); return minimumDialect.isCompatibleTo(targetType); } - public String assemble(ShellControl shellControl) { + public boolean isCompatible(ShellDialect dialect) { + return minimumDialect.isCompatibleTo(dialect); + } + + private String assembleScript(ShellControl shellControl) { if (isCompatible(shellControl)) { var shebang = commands.startsWith("#"); // Fix new lines and shebang @@ -53,35 +59,46 @@ public class SimpleScriptStore extends ScriptStore implements ShellInitCommand.T return null; } + public String assembleScriptChain(ShellControl shellControl) { + var nl = shellControl.getShellDialect().getNewLine().getNewLineString(); + var all = queryFlattenedScripts(); + var r = all.stream().map(ref -> ref.getStore().assembleScript(shellControl)).filter(s -> s != null).toList(); + if (r.isEmpty()) { + return null; + } + return String.join(nl, r); + } + @Override public void checkComplete() throws Throwable { Validators.nonNull(group); super.checkComplete(); Validators.nonNull(minimumDialect); - if (!initScript && !shellScript && !fileScript) { + if (!initScript && !shellScript && !fileScript && !isRunnableScript()) { throw new ValidationException(AppI18n.get("app.valueMustNotBeEmpty")); } } - public void queryFlattenedScripts(LinkedHashSet all) { + public void queryFlattenedScripts(LinkedHashSet> all) { // Prevent loop - all.add(this); + DataStoreEntryRef ref = getSelfEntry().ref(); + all.add(ref); getEffectiveScripts().stream() - .filter(scriptStoreDataStoreEntryRef -> !all.contains(scriptStoreDataStoreEntryRef.getStore())) + .filter(scriptStoreDataStoreEntryRef -> !all.contains(scriptStoreDataStoreEntryRef)) .forEach(scriptStoreDataStoreEntryRef -> { scriptStoreDataStoreEntryRef.getStore().queryFlattenedScripts(all); }); - all.remove(this); - all.add(this); + all.remove(ref); + all.add(ref); } @Override public List> getEffectiveScripts() { - return scripts != null ? scripts.stream().filter(Objects::nonNull).toList() : List.of(); + return scripts != null ? scripts.stream().filter(Objects::nonNull).filter(ref -> ref.get().getValidity().isUsable()).toList() : List.of(); } @Override public Optional terminalContent(ShellControl shellControl) { - return Optional.ofNullable(assemble(shellControl)); + return Optional.ofNullable(assembleScriptChain(shellControl)); } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java index 7e136aa1c..54297995a 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java @@ -45,11 +45,6 @@ public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, Da return true; } - @Override - public boolean shouldEdit() { - return true; - } - @Override public boolean shouldHaveChildren() { return false; @@ -114,7 +109,7 @@ public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, Da .getDeclaredConstructor(Property.class, boolean.class) .newInstance(dialect, false); - var vals = List.of(0, 1, 2); + var vals = List.of(0, 1, 2, 3); var selectedStart = new ArrayList(); if (st.isInitScript()) { selectedStart.add(0); @@ -125,6 +120,9 @@ public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, Da if (st.isFileScript()) { selectedStart.add(2); } + if (st.isRunnableScript()) { + selectedStart.add(3); + } var name = new Function() { @Override @@ -140,6 +138,10 @@ public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, Da if (integer == 2) { return AppI18n.get("fileScript"); } + + if (integer == 3) { + return AppI18n.get("runnableScript"); + } return "?"; } }; @@ -200,6 +202,7 @@ public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, Da .initScript(selectedExecTypes.contains(0)) .shellScript(selectedExecTypes.contains(1)) .fileScript(selectedExecTypes.contains(2)) + .runnableScript(selectedExecTypes.contains(3)) .build(); }, store) diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java index 6f40bf5eb..5fb0aa262 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java @@ -35,7 +35,7 @@ public class ServiceOpenAction implements ActionProvider { } @Override - public List getChildren() { + public List getChildren(DataStoreEntryRef store) { return List.of(new ServiceOpenHttpAction(), new ServiceOpenHttpsAction()); } }; diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java index e4850d73e..9a96cbf7b 100644 --- a/ext/base/src/main/java/module-info.java +++ b/ext/base/src/main/java/module-info.java @@ -72,6 +72,7 @@ open module io.xpipe.ext.base { ServiceCopyUrlAction, CloneStoreAction, RefreshChildrenStoreAction, + RunScriptActionMenu, LaunchStoreAction, XPipeUrlAction, EditStoreAction, diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh deleted file mode 100644 index 3e5dd7717..000000000 --- a/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh +++ /dev/null @@ -1 +0,0 @@ -sudo apt update \ No newline at end of file diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_upgrade.sh b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_upgrade.sh new file mode 100644 index 000000000..32ab17aa0 --- /dev/null +++ b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_upgrade.sh @@ -0,0 +1 @@ +sudo apt update && sudo apt upgrade \ No newline at end of file diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/diff.sh b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/diff.sh new file mode 100644 index 000000000..57a3f23bb --- /dev/null +++ b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/diff.sh @@ -0,0 +1 @@ +diff "$1" "$2" diff --git a/lang/base/strings/translations_da.properties b/lang/base/strings/translations_da.properties index 0e59d3c6c..4a118dfbf 100644 --- a/lang/base/strings/translations_da.properties +++ b/lang/base/strings/translations_da.properties @@ -155,7 +155,8 @@ openWebsite=Åben hjemmeside customServiceGroup.displayName=Service-gruppe customServiceGroup.displayDescription=Gruppér flere tjenester i én kategori initScript=Init-script - køres ved shell-init -shellScript=Sessionsscript - Gør scriptet tilgængeligt under en shell-session +shellScript=Shell-sessionsscript - Gør et script tilgængeligt til at køre under en shell-session +runnableScript=Kørbart script - Tillad, at scriptet køres direkte fra connection hub'en fileScript=Filscript - Gør det muligt at kalde et script med filargumenter i filbrowseren runScript=Kør script copyUrl=Kopier URL diff --git a/lang/base/strings/translations_de.properties b/lang/base/strings/translations_de.properties index 066c8c6ac..7d0ef586a 100644 --- a/lang/base/strings/translations_de.properties +++ b/lang/base/strings/translations_de.properties @@ -146,7 +146,8 @@ openWebsite=Website öffnen customServiceGroup.displayName=Dienstgruppe customServiceGroup.displayDescription=Mehrere Dienste in einer Kategorie zusammenfassen initScript=Init-Skript - Wird beim Shell-Init ausgeführt -shellScript=Sitzungsskript - Skript während der Shell-Sitzung verfügbar machen +shellScript=Shell-Sitzungsskript - Skript für die Ausführung während einer Shell-Sitzung verfügbar machen +runnableScript=Ausführbares Skript - Erlaubt die direkte Ausführung eines Skripts über den Verbindungs-Hub fileScript=Dateiskript - Erlaubt den Aufruf eines Skripts mit Dateiargumenten im Dateibrowser runScript=Skript ausführen copyUrl=URL kopieren diff --git a/lang/base/strings/translations_en.properties b/lang/base/strings/translations_en.properties index f78731a6a..86fdfe889 100644 --- a/lang/base/strings/translations_en.properties +++ b/lang/base/strings/translations_en.properties @@ -144,7 +144,8 @@ openWebsite=Open website customServiceGroup.displayName=Service group customServiceGroup.displayDescription=Group multiple services into one category initScript=Init script - Run on shell init -shellScript=Session script - Make script available during shell session +shellScript=Shell session script - Make script available to run during a shell session +runnableScript=Runnable script - Allow script to be run directly from the connection hub fileScript=File script - Allow script to be called with file arguments in the file browser runScript=Run script copyUrl=Copy URL diff --git a/lang/base/strings/translations_es.properties b/lang/base/strings/translations_es.properties index 1eb3aea4e..3862c0c06 100644 --- a/lang/base/strings/translations_es.properties +++ b/lang/base/strings/translations_es.properties @@ -144,7 +144,8 @@ openWebsite=Abrir sitio web customServiceGroup.displayName=Grupo de servicios customServiceGroup.displayDescription=Agrupa varios servicios en una categoría initScript=Script de init - Se ejecuta en el shell init -shellScript=Script de sesión - Hacer que el script esté disponible durante la sesión shell +shellScript=Script de sesión de shell - Hacer que un script esté disponible para ejecutarse durante una sesión de shell +runnableScript=Script ejecutable - Permite que el script se ejecute directamente desde el concentrador de conexiones fileScript=Script de archivo - Permite llamar al script con argumentos de archivo en el explorador de archivos runScript=Ejecutar script copyUrl=Copiar URL diff --git a/lang/base/strings/translations_fr.properties b/lang/base/strings/translations_fr.properties index bca75d0bc..f10217cc8 100644 --- a/lang/base/strings/translations_fr.properties +++ b/lang/base/strings/translations_fr.properties @@ -144,7 +144,8 @@ openWebsite=Ouvrir un site web customServiceGroup.displayName=Groupe de service customServiceGroup.displayDescription=Regrouper plusieurs services dans une même catégorie initScript=Script d'initialisation - Exécuté lors de l'initialisation de l'interpréteur de commandes -shellScript=Script de session - Rendre le script disponible pendant la session de l'interpréteur de commandes +shellScript=Script de session shell - Rendre un script disponible pour être exécuté au cours d'une session shell +runnableScript=Script exécutable - Permet d'exécuter un script directement à partir du concentrateur de connexion fileScript=Script de fichier - Permet d'appeler un script avec des arguments de fichier dans le navigateur de fichiers runScript=Exécuter un script copyUrl=Copier l'URL diff --git a/lang/base/strings/translations_it.properties b/lang/base/strings/translations_it.properties index 16780c2d8..5de8faf00 100644 --- a/lang/base/strings/translations_it.properties +++ b/lang/base/strings/translations_it.properties @@ -144,7 +144,8 @@ openWebsite=Sito web aperto customServiceGroup.displayName=Gruppo di servizio customServiceGroup.displayDescription=Raggruppa più servizi in un'unica categoria initScript=Script di avvio - Eseguito all'avvio della shell -shellScript=Script di sessione - Rendi disponibile lo script durante la sessione della shell +shellScript=Script di sessione di shell - Rendere disponibile uno script da eseguire durante una sessione di shell +runnableScript=Script eseguibile - Consente l'esecuzione di uno script direttamente dall'hub di connessione fileScript=File script - Consente di richiamare uno script con argomenti di file nel browser di file runScript=Esegui script copyUrl=Copia URL diff --git a/lang/base/strings/translations_ja.properties b/lang/base/strings/translations_ja.properties index 8d15b1afb..4903a3bcb 100644 --- a/lang/base/strings/translations_ja.properties +++ b/lang/base/strings/translations_ja.properties @@ -144,7 +144,8 @@ openWebsite=オープンウェブサイト customServiceGroup.displayName=サービスグループ customServiceGroup.displayDescription=複数のサービスを1つのカテゴリーにまとめる initScript=initスクリプト - シェルのinit時に実行する -shellScript=セッションスクリプト - シェルセッション中にスクリプトを利用可能にする +shellScript=シェルセッションスクリプト - シェルセッション中に実行可能なスクリプトを作成する。 +runnableScript=実行可能なスクリプト - 接続ハブからスクリプトを直接実行できるようにする fileScript=ファイルスクリプト - ファイルブラウザでファイル引数を指定してスクリプトを呼び出せるようにする runScript=スクリプトを実行する copyUrl=URLをコピーする diff --git a/lang/base/strings/translations_nl.properties b/lang/base/strings/translations_nl.properties index 51d590f21..2620d511d 100644 --- a/lang/base/strings/translations_nl.properties +++ b/lang/base/strings/translations_nl.properties @@ -144,7 +144,8 @@ openWebsite=Open website customServiceGroup.displayName=Servicegroep customServiceGroup.displayDescription=Groepeer meerdere diensten in één categorie initScript=Init script - Uitvoeren op shell init -shellScript=Sessiescript - Script beschikbaar maken tijdens een shellsessie +shellScript=Shell-sessiescript - Script beschikbaar maken om uit te voeren tijdens een shellsessie +runnableScript=Runnable script - Maakt het mogelijk om een script direct vanuit de verbindingshub uit te voeren fileScript=Bestandsscript - Laat toe dat script wordt aangeroepen met bestandsargumenten in de bestandsbrowser runScript=Script uitvoeren copyUrl=URL kopiëren diff --git a/lang/base/strings/translations_pt.properties b/lang/base/strings/translations_pt.properties index 02ab73a51..7f79aea1d 100644 --- a/lang/base/strings/translations_pt.properties +++ b/lang/base/strings/translations_pt.properties @@ -144,7 +144,8 @@ openWebsite=Abre o sítio Web customServiceGroup.displayName=Grupo de serviços customServiceGroup.displayDescription=Agrupa vários serviços numa categoria initScript=Script de inicialização - Executa na inicialização do shell -shellScript=Script de sessão - Torna o script disponível durante a sessão do shell +shellScript=Script de sessão de shell - Torna o script disponível para ser executado durante uma sessão de shell +runnableScript=Script executável - Permite que o script seja executado diretamente a partir do hub de ligação fileScript=Script de ficheiro - Permite que o script seja chamado com argumentos de ficheiro no navegador de ficheiros runScript=Executa o script copyUrl=Copia o URL diff --git a/lang/base/strings/translations_ru.properties b/lang/base/strings/translations_ru.properties index 02ab692ac..0959e00a5 100644 --- a/lang/base/strings/translations_ru.properties +++ b/lang/base/strings/translations_ru.properties @@ -144,7 +144,8 @@ openWebsite=Открытый сайт customServiceGroup.displayName=Группа услуг customServiceGroup.displayDescription=Сгруппируйте несколько сервисов в одну категорию initScript=Init script - скрипт, запускаемый при инициализации оболочки -shellScript=Скрипт сессии - сделай скрипт доступным во время сеанса работы с оболочкой +shellScript=Скрипт сеанса оболочки - сделать скрипт доступным для выполнения во время сеанса оболочки +runnableScript=Запускаемый скрипт - позволяет запускать скрипт прямо из концентратора соединений fileScript=Файловый скрипт - позволяет вызывать скрипт с аргументами файла в файловом браузере runScript=Запуск скрипта copyUrl=Копировать URL diff --git a/lang/base/strings/translations_tr.properties b/lang/base/strings/translations_tr.properties index f7d249801..e6b579e0f 100644 --- a/lang/base/strings/translations_tr.properties +++ b/lang/base/strings/translations_tr.properties @@ -144,7 +144,8 @@ openWebsite=Açık web sitesi customServiceGroup.displayName=Hizmet grubu customServiceGroup.displayDescription=Birden fazla hizmeti tek bir kategoride gruplayın initScript=Başlangıç betiği - Kabuk başlangıcında çalıştır -shellScript=Oturum betiği - Betiği kabuk oturumu sırasında kullanılabilir hale getirin +shellScript=Kabuk oturumu komut dosyası - Komut dosyasını kabuk oturumu sırasında çalıştırılabilir hale getirin +runnableScript=Çalıştırılabilir komut dosyası - Komut dosyasının doğrudan bağlantı hub'ından çalıştırılmasına izin ver fileScript=Dosya betiği - Dosya tarayıcısında betiğin dosya argümanlarıyla çağrılmasına izin ver runScript=Komut dosyasını çalıştır copyUrl=URL'yi kopyala diff --git a/lang/base/strings/translations_zh.properties b/lang/base/strings/translations_zh.properties index edf5b683c..71aa1c16d 100644 --- a/lang/base/strings/translations_zh.properties +++ b/lang/base/strings/translations_zh.properties @@ -144,7 +144,8 @@ openWebsite=打开网站 customServiceGroup.displayName=服务组 customServiceGroup.displayDescription=将多项服务归为一类 initScript=初始脚本 - 在 shell 启动时运行 -shellScript=会话脚本 - 在 shell 会话期间提供脚本 +shellScript=shell 会话脚本 - 在 shell 会话中运行脚本 +runnableScript=可运行脚本 - 允许从连接集线器直接运行脚本 fileScript=文件脚本 - 允许在文件浏览器中使用文件参数调用脚本 runScript=运行脚本 copyUrl=复制 URL diff --git a/lang/base/texts/executionType_da.md b/lang/base/texts/executionType_da.md index a9617f683..126d34517 100644 --- a/lang/base/texts/executionType_da.md +++ b/lang/base/texts/executionType_da.md @@ -2,15 +2,15 @@ Du kan bruge et script i flere forskellige scenarier. -Når du aktiverer et script, dikterer udførelsestyperne, hvad XPipe vil gøre med scriptet. +Når du aktiverer et script via dets aktiveringsknap, dikterer udførelsestyperne, hvad XPipe vil gøre med scriptet. -## Init-scripts +## Init-script-type -Når et script er angivet som init-script, kan det vælges i shell-miljøer. +Når et script er angivet som init-script, kan det vælges i shell-miljøer til at blive kørt ved init. Hvis et script er aktiveret, vil det desuden automatisk blive kørt ved init i alle kompatible shells. -Hvis du f.eks. opretter et simpelt init-script som +Hvis du f.eks. opretter et simpelt init-script med ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` du vil have adgang til disse aliasser i alle kompatible shell-sessioner, hvis scriptet er aktiveret. -## Shell-scripts +## Kørbar script-type -Et normalt shell-script er beregnet til at blive kaldt i en shell-session i din terminal. -Når det er aktiveret, bliver scriptet kopieret til målsystemet og lagt ind i PATH i alle kompatible shells. -På den måde kan du kalde scriptet fra hvor som helst i en terminalsession. +Et kørbart shell-script er beregnet til at blive kaldt for en bestemt forbindelse fra forbindelseshubben. +Når dette script er aktiveret, vil scriptet være tilgængeligt for kald fra scripts-knappen for en forbindelse med en kompatibel shell-dialekt. + +Hvis du f.eks. opretter et simpelt `sh`-dialekt-shellscript med navnet `ps` for at vise den aktuelle procesliste med +``` +ps -A +``` +kan du kalde scriptet på enhver kompatibel forbindelse i menuen scripts. + +## Fil script type + +Endelig kan du også køre brugerdefinerede scripts med filinput fra filbrowserens grænseflade. +Når et filscript er aktiveret, vises det i filbrowseren, så det kan køres med filinput. + +Hvis du f.eks. opretter et simpelt filscript med +``` +diff "$1" "$2" +``` +kan du køre scriptet på udvalgte filer, hvis scriptet er aktiveret. +I dette eksempel vil scriptet kun køre, hvis du har valgt præcis to filer. +Ellers vil diff-kommandoen mislykkes. + +## Shell-session script type + +Et sessionsscript er beregnet til at blive kaldt i en shell-session i din terminal. +Når det er aktiveret, vil scriptet blive kopieret til målsystemet og lagt i PATH i alle kompatible shells. +På den måde kan du kalde scriptet hvor som helst i en terminalsession. Scriptnavnet skrives med små bogstaver, og mellemrum erstattes med understregninger, så du nemt kan kalde scriptet. -Hvis du f.eks. opretter et simpelt shell-script med navnet `apti` som +Hvis du for eksempel opretter et simpelt shellscript til `sh`-dialekter ved navn `apti` med ``` sudo apt install "$1" ``` -kan du kalde det på ethvert kompatibelt system med `apti.sh `, hvis scriptet er aktiveret. - -## Fil-scripts - -Endelig kan du også køre brugerdefinerede scripts med filinput fra filbrowser-grænsefladen. -Når et filscript er aktiveret, vises det i filbrowseren, så det kan køres med filinput. - -Hvis du f.eks. opretter et simpelt filscript som -``` -sudo apt install "$@" -``` -kan du køre scriptet på udvalgte filer, hvis scriptet er aktiveret. +kan du kalde scriptet på ethvert kompatibelt system med `apti.sh ` i en terminalsession, hvis scriptet er aktiveret. ## Flere typer -Da eksemplet på fil-scriptet er det samme som eksemplet på shell-scriptet ovenfor, -kan du se, at du også kan sætte kryds i flere bokse for udførelsestyper af et script, hvis de skal bruges i flere scenarier. - - +Du kan også markere flere felter for udførelsestyper af et script, hvis de skal bruges i flere scenarier. diff --git a/lang/base/texts/executionType_de.md b/lang/base/texts/executionType_de.md index cc16f49e2..1a5049955 100644 --- a/lang/base/texts/executionType_de.md +++ b/lang/base/texts/executionType_de.md @@ -2,15 +2,15 @@ Du kannst ein Skript in vielen verschiedenen Szenarien verwenden. -Wenn du ein Skript aktivierst, legen die Ausführungsarten fest, was XPipe mit dem Skript tun soll. +Wenn du ein Skript über die Schaltfläche "Aktivieren" aktivierst, legen die Ausführungsarten fest, was XPipe mit dem Skript tun soll. -## Init-Skripte +## Init-Skripttyp -Wenn ein Skript als Init-Skript gekennzeichnet ist, kann es in Shell-Umgebungen ausgewählt werden. +Wenn ein Skript als Init-Skript gekennzeichnet ist, kann es in Shell-Umgebungen ausgewählt werden, um bei Init ausgeführt zu werden. -Wenn ein Skript aktiviert ist, wird es außerdem automatisch bei init in allen kompatiblen Shells ausgeführt. +Wenn ein Skript aktiviert ist, wird es außerdem in allen kompatiblen Shells automatisch bei init ausgeführt. -Wenn du zum Beispiel ein einfaches Init-Skript erstellst wie +Wenn du zum Beispiel ein einfaches Init-Skript mit ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` hast du in allen kompatiblen Shell-Sitzungen Zugang zu diesen Aliasen, wenn das Skript aktiviert ist. -## Shell-Skripte +## Lauffähiger Skripttyp -Ein normales Shell-Skript ist dafür gedacht, in einer Shell-Sitzung in deinem Terminal aufgerufen zu werden. -Wenn es aktiviert ist, wird das Skript auf das Zielsystem kopiert und in den PATH aller kompatiblen Shells aufgenommen. -So kannst du das Skript von überall in einer Terminal-Sitzung aufrufen. -Der Skriptname wird kleingeschrieben und Leerzeichen werden durch Unterstriche ersetzt, damit du das Skript leicht aufrufen kannst. +Ein lauffähiges Shell-Skript ist dafür gedacht, für eine bestimmte Verbindung vom Verbindungs-Hub aus aufgerufen zu werden. +Wenn dieses Skript aktiviert ist, kann das Skript über die Schaltfläche Skripte für eine Verbindung mit einem kompatiblen Shell-Dialekt aufgerufen werden. -Wenn du zum Beispiel ein einfaches Shell-Skript mit dem Namen `apti` wie folgt erstellst +Wenn du zum Beispiel ein einfaches Shell-Skript im `sh`-Dialekt mit dem Namen `ps` erstellst, um die aktuelle Prozessliste anzuzeigen mit ``` -sudo apt install "$1" +ps -A ``` -kannst du das auf jedem kompatiblen System mit `apti.sh ` aufrufen, wenn das Skript aktiviert ist. +kannst du das Skript auf jeder kompatiblen Verbindung im Menü Skripte aufrufen. -## Datei-Skripte +## Datei-Skripttyp Schließlich kannst du auch benutzerdefinierte Skripte mit Dateieingaben über die Dateibrowser-Schnittstelle ausführen. Wenn ein Dateiskript aktiviert ist, wird es im Dateibrowser angezeigt und kann mit Dateieingaben ausgeführt werden. -Wenn du zum Beispiel ein einfaches Dateiskript erstellst wie +Wenn du zum Beispiel ein einfaches Dateiskript erstellst mit ``` -sudo apt install "$@" +diff "$1" "$2" ``` -kannst du das Skript für ausgewählte Dateien ausführen, wenn das Skript aktiviert ist. +erstellst, kannst du das Skript für ausgewählte Dateien ausführen, wenn das Skript aktiviert ist. +In diesem Beispiel wird das Skript nur dann erfolgreich ausgeführt, wenn du genau zwei Dateien ausgewählt hast. +Andernfalls wird der Befehl diff fehlschlagen. + +## Shell-Sitzung Skripttyp + +Ein Sitzungsskript ist dafür gedacht, in einer Shell-Sitzung in deinem Terminal aufgerufen zu werden. +Wenn es aktiviert ist, wird das Skript auf das Zielsystem kopiert und in den PATH aller kompatiblen Shells aufgenommen. +So kannst du das Skript von überall in einer Terminalsitzung aufrufen. +Der Skriptname wird kleingeschrieben und Leerzeichen werden durch Unterstriche ersetzt, damit du das Skript leicht aufrufen kannst. + +Wenn du zum Beispiel ein einfaches Shell-Skript für `sh`-Dialekte namens `apti` mit +``` +sudo apt install "$1" +``` +kannst du das Skript auf jedem kompatiblen System mit `apti.sh ` in einer Terminalsitzung aufrufen, wenn das Skript aktiviert ist. ## Mehrere Typen -Da das Beispielskript für die Datei dasselbe ist wie das Beispielsskript für die Shell oben, -siehst du, dass du auch mehrere Kästchen für die Ausführungsarten eines Skripts ankreuzen kannst, wenn sie in mehreren Szenarien verwendet werden sollen. - - +Du kannst auch mehrere Kästchen für die Ausführungsarten eines Skripts ankreuzen, wenn sie in mehreren Szenarien verwendet werden sollen. diff --git a/lang/base/texts/executionType_en.md b/lang/base/texts/executionType_en.md index 513328e35..df92a4c02 100644 --- a/lang/base/texts/executionType_en.md +++ b/lang/base/texts/executionType_en.md @@ -6,11 +6,11 @@ When enabling a script via its enable toggle button, the execution types dictate ## Init script type -When a script is designated as init script, it can be selected in shell environments. +When a script is designated as init script, it can be selected in shell environments to be run on init. Furthermore, if a script is enabled, it will automatically be run on init in all compatible shells. -For example, if you create a simple init script like +For example, if you create a simple init script with ``` alias ll="ls -l" alias la="ls -A" @@ -18,25 +18,23 @@ alias l="ls -CF" ``` you will have access to these aliases in all compatible shell sessions if the script is enabled. -## Session script type +## Runnable script type -A shell session script is intended to be called in a shell session in your terminal. -When enabled, the script will be copied to the target system and put into the PATH in all compatible shells. -This allows you to call the script from anywhere in a terminal session. -The script name will be lowercased and spaces will be replaced with underscores, allowing you to easily call the script. +A runnable shell script is intended to be called for a certain connection from the connection hub. +When this script is enabled, the script will be available to call from the scripts button for a connection with a compatible shell dialect. -For example, if you create a simple shell script named `apti` with +For example, if you create a simple `sh` dialect shell script named `ps` to show the current process list with ``` -sudo apt install "$1" +ps -A ``` -you can call the script on any compatible system with `apti.sh ` if the script is enabled. +you can call the script on any compatible connection in the scripts menu. ## File script type Lastly, you can also run custom script with file inputs from the file browser interface. When a file script is enabled, it will show up in the file browser to be run with file inputs. -For example, if you create a simple file script like +For example, if you create a simple file script with ``` diff "$1" "$2" ``` @@ -44,11 +42,19 @@ you can run the script on selected files if the script is enabled. In this example, the script will only run successfully if you have exactly two files selected. Otherwise, the diff command will fail. +## Shell session script type + +A session script is intended to be called in a shell session in your terminal. +When enabled, the script will be copied to the target system and put into the PATH in all compatible shells. +This allows you to call the script from anywhere in a terminal session. +The script name will be lowercased and spaces will be replaced with underscores, allowing you to easily call the script. + +For example, if you create a simple shell script for `sh` dialects named `apti` with +``` +sudo apt install "$1" +``` +you can call the script on any compatible system with `apti.sh ` in a terminal session if the script is enabled. + ## Multiple types You can also tick multiple boxes for execution types of a script if they should be used in multiple scenarios. - -For example in many cases, you can use file scripts also as normal shell scripts -to bring into your shell sessions to call them with specific arguments manually. - - diff --git a/lang/base/texts/executionType_es.md b/lang/base/texts/executionType_es.md index 5cc3852c9..72ac9ae3d 100644 --- a/lang/base/texts/executionType_es.md +++ b/lang/base/texts/executionType_es.md @@ -2,15 +2,15 @@ Puedes utilizar un script en múltiples escenarios diferentes. -Al activar un script, los tipos de ejecución dictan lo que XPipe hará con el script. +Al activar un script mediante su botón de activación, los tipos de ejecución dictan lo que XPipe hará con el script. -## Guiones de inicio +## Tipo de script de inicio -Cuando un script se designa como script init, se puede seleccionar en entornos shell. +Cuando un script se designa como script init, se puede seleccionar en entornos shell para que se ejecute en init. Además, si un script está activado, se ejecutará automáticamente en init en todos los shells compatibles. -Por ejemplo, si creas un script init sencillo como +Por ejemplo, si creas un script init simple con ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` tendrás acceso a estos alias en todas las sesiones de shell compatibles si el script está activado. -## Scripts de shell +## Tipo de script ejecutable -Un script de shell normal está pensado para ser llamado en una sesión de shell en tu terminal. -Cuando está activado, el script se copiará en el sistema de destino y se pondrá en el PATH en todas las shell compatibles. +Un script de shell ejecutable está destinado a ser llamado para una determinada conexión desde el concentrador de conexiones. +Cuando este script está habilitado, el script estará disponible para ser llamado desde el botón de scripts para una conexión con un dialecto shell compatible. + +Por ejemplo, si creas un sencillo script de shell de dialecto `sh` llamado `ps` para mostrar la lista de procesos actuales con +``` +ps -A +``` +puedes llamar al script en cualquier conexión compatible en el menú scripts. + +## Archivo tipo script + +Por último, también puedes ejecutar scripts personalizados con entradas de archivo desde la interfaz del explorador de archivos. +Cuando se habilita un script de archivo, aparecerá en el explorador de archivos para ser ejecutado con entradas de archivo. + +Por ejemplo, si creas un script de archivo simple con +``` +diff "$1" "$2" +``` +puedes ejecutar el script en los archivos seleccionados si el script está activado. +En este ejemplo, el script sólo se ejecutará correctamente si tienes exactamente dos archivos seleccionados. +De lo contrario, el comando diff fallará. + +## Sesión de shell tipo script + +Un script de sesión está pensado para ser llamado en una sesión shell en tu terminal. +Cuando está activado, el script se copiará en el sistema de destino y se pondrá en el PATH en todos los shells compatibles. Esto te permite llamar al script desde cualquier lugar de una sesión de terminal. El nombre del script se escribirá en minúsculas y los espacios se sustituirán por guiones bajos, lo que te permitirá llamarlo fácilmente. -Por ejemplo, si creas un sencillo script de shell llamado `apti` como +Por ejemplo, si creas un script de shell sencillo para dialectos `sh` llamado `apti` con ``` sudo apt install "$1" ``` -puedes invocarlo en cualquier sistema compatible con `apti.sh ` si el script está activado. - -## Archivo scripts - -Por último, también puedes ejecutar scripts personalizados con entradas de archivo desde la interfaz del explorador de archivos. -Cuando un script de archivo esté activado, aparecerá en el explorador de archivos para ejecutarse con entradas de archivo. - -Por ejemplo, si creas un script de archivo sencillo como -``` -sudo apt install "$@" -``` -puedes ejecutar el script en los archivos seleccionados si el script está activado. +puedes llamar al script en cualquier sistema compatible con `apti.sh ` en una sesión de terminal si el script está activado. ## Tipos múltiples -Como el script de archivo de ejemplo es el mismo que el script de shell de ejemplo anterior, -verás que también puedes marcar varias casillas para los tipos de ejecución de un script si deben utilizarse en varios escenarios. - - +También puedes marcar varias casillas para los tipos de ejecución de un script si deben utilizarse en varios escenarios. diff --git a/lang/base/texts/executionType_fr.md b/lang/base/texts/executionType_fr.md index 63d1f1b99..9ed9ffc74 100644 --- a/lang/base/texts/executionType_fr.md +++ b/lang/base/texts/executionType_fr.md @@ -2,15 +2,15 @@ Tu peux utiliser un script dans plusieurs scénarios différents. -Lors de l'activation d'un script, les types d'exécution dictent ce que XPipe fera avec le script. +Lors de l'activation d'un script via son bouton bascule d'activation, les types d'exécution dictent ce que XPipe fera avec le script. -## Init scripts +## Type de script d'initialisation -Lorsqu'un script est désigné comme script init, il peut être sélectionné dans les environnements shell. +Lorsqu'un script est désigné comme script init, il peut être sélectionné dans les environnements shell pour être exécuté lors de l'init. -De plus, si un script est activé, il sera automatiquement exécuté lors de l'init dans tous les shells compatibles. +De plus, si un script est activé, il sera automatiquement exécuté lors de l'initialisation dans tous les shells compatibles. -Par exemple, si tu crées un script init simple comme +Par exemple, si tu crées un script init simple avec ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` tu auras accès à ces alias dans toutes les sessions shell compatibles si le script est activé. -## Scripts shell +## Type de script exécutable -Un script shell normal est destiné à être appelé dans une session shell dans ton terminal. -Lorsqu'il est activé, le script sera copié sur le système cible et placé dans le chemin d'accès (PATH) de tous les shells compatibles. -Cela te permet d'appeler le script depuis n'importe quel endroit d'une session de terminal. -Le nom du script sera en minuscules et les espaces seront remplacés par des traits de soulignement, ce qui te permettra d'appeler facilement le script. +Un script shell exécutable est destiné à être appelé pour une certaine connexion à partir du hub de connexion. +Lorsque ce script est activé, il sera possible de l'appeler à partir du bouton scripts pour une connexion avec un dialecte shell compatible. -Par exemple, si tu crées un script shell simple nommé `apti` comme suit +Par exemple, si tu crées un simple script shell de dialecte `sh` nommé `ps` pour afficher la liste des processus en cours avec ``` -sudo apt install "$1" +ps -A ``` -vous pouvez l'appeler sur n'importe quel système compatible avec `apti.sh ` si le script est activé. +tu peux appeler le script sur n'importe quelle connexion compatible dans le menu des scripts. -## Fichier scripts +## Fichier type de script Enfin, tu peux aussi exécuter des scripts personnalisés avec des entrées de fichiers à partir de l'interface du navigateur de fichiers. Lorsqu'un script de fichier est activé, il s'affiche dans le navigateur de fichiers pour être exécuté avec des entrées de fichier. -Par exemple, si tu crées un script de fichier simple comme +Par exemple, si tu crées un script de fichier simple avec ``` -sudo apt install "$@" +diff "$1" "$2" ``` tu peux exécuter le script sur les fichiers sélectionnés si le script est activé. +Dans cet exemple, le script ne s'exécutera avec succès que si tu as exactement deux fichiers sélectionnés. +Sinon, la commande diff échouera. + +## Session shell type de script + +Un script de session est destiné à être appelé dans une session shell dans ton terminal. +Lorsqu'il est activé, le script est copié sur le système cible et placé dans le chemin d'accès (PATH) de tous les shells compatibles. +Cela te permet d'appeler le script depuis n'importe quel endroit d'une session de terminal. +Le nom du script sera en minuscules et les espaces seront remplacés par des traits de soulignement, ce qui te permettra d'appeler facilement le script. + +Par exemple, si tu crées un script shell simple pour les dialectes `sh` nommé `apti` avec +``` +sudo apt install "$1" +``` +tu peux appeler le script sur n'importe quel système compatible avec `apti.sh ` dans une session de terminal si le script est activé. ## Plusieurs types -Comme l'exemple de script de fichier est le même que l'exemple de script shell ci-dessus, -tu vois que tu peux aussi cocher plusieurs cases pour les types d'exécution d'un script s'ils doivent être utilisés dans plusieurs scénarios. - - +Tu peux aussi cocher plusieurs cases pour les types d'exécution d'un script s'ils doivent être utilisés dans plusieurs scénarios. diff --git a/lang/base/texts/executionType_it.md b/lang/base/texts/executionType_it.md index d3c07a921..ba1553f04 100644 --- a/lang/base/texts/executionType_it.md +++ b/lang/base/texts/executionType_it.md @@ -2,15 +2,15 @@ Puoi utilizzare uno script in diversi scenari. -Quando abiliti uno script, i tipi di esecuzione stabiliscono cosa XPipe farà con lo script. +Quando abiliti uno script tramite il pulsante di attivazione, i tipi di esecuzione stabiliscono cosa XPipe farà con lo script. -## Script di avvio +## Tipo di script iniziale -Quando uno script è designato come script di avvio, può essere selezionato negli ambienti shell. +Quando uno script è designato come script di avvio, può essere selezionato negli ambienti shell per essere eseguito all'avvio. Inoltre, se uno script è abilitato, verrà eseguito automaticamente all'avvio in tutte le shell compatibili. -Ad esempio, se crei un semplice script di avvio come +Ad esempio, se crei un semplice script di avvio con ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` avrai accesso a questi alias in tutte le sessioni di shell compatibili se lo script è abilitato. -## Script di shell +## Tipo di script eseguibile -Un normale script di shell è destinato a essere richiamato in una sessione di shell nel tuo terminale. -Se abilitato, lo script verrà copiato sul sistema di destinazione e inserito nel PATH di tutte le shell compatibili. +Uno script di shell eseguibile è destinato a essere richiamato per una determinata connessione dall'hub di connessione. +Quando questo script è abilitato, sarà disponibile per essere richiamato dal pulsante script per una connessione con un dialetto shell compatibile. + +Ad esempio, se crei un semplice script di shell in dialetto `sh` chiamato `ps` per mostrare l'elenco dei processi correnti con +``` +ps -A +``` +puoi richiamare lo script su qualsiasi connessione compatibile nel menu degli script. + +## Tipo di file script + +Infine, puoi anche eseguire script personalizzati con input da file dall'interfaccia del browser dei file. +Quando un file script è abilitato, viene visualizzato nel browser dei file per essere eseguito con gli input dei file. + +Ad esempio, se crei un semplice file script con +``` +diff "$1" "$2" +``` +puoi eseguire lo script sui file selezionati se lo script è abilitato. +In questo esempio, lo script verrà eseguito correttamente solo se sono stati selezionati esattamente due file. +In caso contrario, il comando diff fallirà. + +## Tipo di script della sessione di shell + +Uno script di sessione è destinato a essere richiamato in una sessione di shell nel tuo terminale. +Se abilitato, lo script verrà copiato sul sistema di destinazione e inserito nel PATH in tutte le shell compatibili. Questo ti permette di richiamare lo script da qualsiasi punto di una sessione di terminale. Il nome dello script sarà minuscolo e gli spazi saranno sostituiti da trattini bassi, consentendoti di richiamare facilmente lo script. -Ad esempio, se crei un semplice script di shell chiamato `apti` come +Ad esempio, se crei un semplice script di shell per i dialetti `sh` chiamato `apti` con ``` sudo apt install "$1" ``` -puoi richiamarlo su qualsiasi sistema compatibile con `apti.sh ` se lo script è abilitato. - -## File script - -Infine, puoi anche eseguire script personalizzati con input da file dall'interfaccia del browser dei file. -Quando uno script di file è abilitato, viene visualizzato nel browser dei file per essere eseguito con input di file. - -Ad esempio, se crei un semplice script di file come -``` -sudo apt install "$@" -``` -puoi eseguire lo script sui file selezionati se lo script è abilitato. +puoi richiamare lo script su qualsiasi sistema compatibile con `apti.sh ` in una sessione di terminale se lo script è abilitato. ## Tipi multipli -Poiché lo script di esempio per i file è identico allo script di esempio per la shell di cui sopra, -puoi anche spuntare più caselle per i tipi di esecuzione di uno script se questi devono essere utilizzati in più scenari. - - +Puoi anche spuntare più caselle per i tipi di esecuzione di uno script se devono essere utilizzati in più scenari. diff --git a/lang/base/texts/executionType_ja.md b/lang/base/texts/executionType_ja.md index 56656bec9..c1cfd79ad 100644 --- a/lang/base/texts/executionType_ja.md +++ b/lang/base/texts/executionType_ja.md @@ -2,15 +2,15 @@ スクリプトは複数の異なるシナリオで使用できる。 -スクリプトを有効にする場合、実行タイプによってXPipeがスクリプトで何を行うかが決まる。 +有効化トグルボタンでスクリプトを有効にすると、実行タイプによってXPipeがスクリプトに対して何を行うかが決まる。 -## スクリプトの初期化 +## スクリプトの初期タイプ -スクリプトをinitスクリプトとして指定すると、シェル環境で選択できるようになる。 +スクリプトをinitスクリプトとして指定すると、シェル環境でinit時に実行されるスクリプトを選択できる。 -さらに、スクリプトが有効になっていれば、互換性のあるすべてのシェルで、init時に自動的に実行される。 +さらに、スクリプトを有効にすると、互換性のあるすべてのシェルで、 init時に自動的に実行される。 -例えば、次のような単純なinitスクリプトを作成した場合 +例えば、単純なinitスクリプトを ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` スクリプトが有効になっていれば、互換性のあるすべてのシェル・セッションでこれらのエイリアスにアクセスできる。 -## シェルスクリプト +## 実行可能なスクリプトタイプ -通常のシェルスクリプトは、ターミナル上のシェルセッションで呼び出され ることを想定している。 -有効にすると、スクリプトはターゲットシステムにコピーされ、 すべての互換シェルでPATHに入れられる。 -これにより、ターミナル・セッションのどこからでもスクリプトを呼び出すことができる。 +実行可能なシェルスクリプトは、接続ハブから特定の接続に対して呼び出される ことを意図している。 +このスクリプトが有効になっている場合, 互換性のあるシェル弁を持つ接続に対して, スクリプトボタンからスクリプトを呼び出すことができるようになる. + +例えば、単純な `sh` 方言のシェルスクリプトを `ps` という名前で作成し、現在のプロセスリストを表示するために +``` +ps -A +``` +とすれば、互換性のある接続であれば、スクリプトメニューからそのスクリプトを呼び出すことができる。 + +## ファイルスクリプトの種類 + +最後に、カスタムスクリプトをファイルブラウザのインターフェイスからファイル入力で実行することもできる。 +ファイルスクリプトが有効になると、ファイルブラウザに表示され、ファイル入力で実行できるようになる。 + +例えば、単純なファイルスクリプトを +``` +diff "$1" "$2" +``` +というスクリプトを作成すると、 スクリプトが有効になっていれば、選択されたファイルに対して スクリプトを実行することができる。 +この例では、ちょうど2つのファイルが選択されているときだけ、 スクリプトは正常に実行される。 +そうでない場合、diffコマンドは失敗する。 + +## シェルセッションのスクリプトタイプ + +セッションスクリプトは、端末のシェルセッションで呼び出すためのものである。 +有効にすると、スクリプトはターゲットシステムにコピーされ、互換性の あるすべてのシェルのPATHに入れられる。 +これにより、ターミナルセッションのどこからでもスクリプトを呼び出すことができる。 スクリプト名は小文字になり、スペースはアンダースコアに置き換えられるので、簡単にスクリプトを呼び出すことができる。 -例えば、次のような`apti`という単純なシェルスクリプトを作成した場合、次のようになる。 +例えば、`sh`方言用の簡単なシェルスクリプトを`apti`という名前で作成し、それを ``` sudo apt install "$1" ``` -スクリプトが有効になっていれば、互換性のあるシステム上で`apti.sh `を使ってそれを呼び出すことができる。 - -## ファイルスクリプト - -最後に、ファイルブラウザのインターフェイスからファイル入力を使ってカスタムスクリプトを実行することもできる。 -ファイルスクリプトが有効になると、ファイルブラウザに表示され、ファイル入力で実行できるようになる。 - -例えば、次のような簡単なファイルスクリプトを作成した場合 -``` -sudo apt install "$@" -``` -スクリプトが有効になっていれば、選択したファイルに対してスクリプトを実行できる。 +スクリプトが有効になっていれば、ターミナルセッションで`apti.sh `を使って互換性のあるシステム上でスクリプトを呼び出すことができる。 ## 複数のタイプ -ファイルスクリプトのサンプルは、上のシェルスクリプトのサンプルと同じである、 -スクリプトを複数のシナリオで使用する場合は、スクリプトの実行タイプに複数のチェックボックスを付けることもできる。 - - +スクリプトを複数のシナリオで使用する場合、スクリプトの実行タイプに複数のチェックを入れることもできる。 diff --git a/lang/base/texts/executionType_nl.md b/lang/base/texts/executionType_nl.md index c471f03d6..5faf96dd9 100644 --- a/lang/base/texts/executionType_nl.md +++ b/lang/base/texts/executionType_nl.md @@ -2,15 +2,15 @@ Je kunt een script in meerdere verschillende scenario's gebruiken. -Wanneer je een script inschakelt, bepalen de uitvoeringstypen wat XPipe met het script zal doen. +Wanneer je een script inschakelt via de inschakelknop, bepalen de uitvoeringstypen wat XPipe met het script zal doen. -## Init scripts +## Init script type -Als een script is aangewezen als init-script, kan het worden geselecteerd in shell-omgevingen. +Als een script is aangewezen als init-script, kan het in shell-omgevingen worden geselecteerd om bij init te worden uitgevoerd. -Bovendien, als een script is ingeschakeld, zal het automatisch worden uitgevoerd op init in alle compatibele shells. +Bovendien, als een script is ingeschakeld, zal het automatisch op init worden uitgevoerd in alle compatibele shells. -Als je bijvoorbeeld een eenvoudig init-script maakt als +Als je bijvoorbeeld een eenvoudig init-script maakt met ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` je hebt toegang tot deze aliassen in alle compatibele shell sessies als het script is ingeschakeld. -## Shell scripts +## Runnable scripttype -Een normaal shellscript is bedoeld om aangeroepen te worden in een shellsessie in je terminal. -Als dit is ingeschakeld, wordt het script gekopieerd naar het doelsysteem en in het PATH van alle compatibele shells gezet. -Hierdoor kun je het script overal vandaan in een terminalsessie aanroepen. -De scriptnaam wordt met kleine letters geschreven en spaties worden vervangen door underscores, zodat je het script gemakkelijk kunt aanroepen. +Een uitvoerbaar shellscript is bedoeld om te worden aangeroepen voor een bepaalde verbinding vanuit de verbindingshub. +Als dit script is ingeschakeld, is het script beschikbaar om aan te roepen via de scripts knop voor een verbinding met een compatibel shell dialect. -Als je bijvoorbeeld een eenvoudig shellscript maakt met de naam `apti` zoals +Als je bijvoorbeeld een eenvoudig `sh` dialect shellscript maakt met de naam `ps` om de huidige proceslijst te tonen met ``` -sudo apt install "$1" +ps -A ``` -kun je dat op elk compatibel systeem aanroepen met `apti.sh ` als het script is ingeschakeld. +kun je het script op elke compatibele verbinding aanroepen in het menu scripts. -## Bestandsscripts +## Type bestandsscript Tot slot kun je ook aangepaste scripts uitvoeren met bestandsinvoer vanuit de bestandsbrowserinterface. Als een bestandsscript is ingeschakeld, verschijnt het in de bestandsbrowser om te worden uitgevoerd met bestandsinvoer. -Als je bijvoorbeeld een eenvoudig bestandsscript maakt zoals +Als je bijvoorbeeld een eenvoudig bestandsscript maakt met ``` -sudo apt install "$@" +diff "$1" "$2" ``` kun je het script uitvoeren op geselecteerde bestanden als het script is ingeschakeld. +In dit voorbeeld zal het script alleen succesvol draaien als je precies twee bestanden hebt geselecteerd. +Anders zal het diff commando mislukken. + +## Shell sessie script type + +Een sessie script is bedoeld om aangeroepen te worden in een shell sessie in je terminal. +Als het is ingeschakeld, wordt het script gekopieerd naar het doelsysteem en in het PATH van alle compatibele shells gezet. +Hierdoor kun je het script overal vandaan in een terminalsessie aanroepen. +De scriptnaam wordt met kleine letters geschreven en spaties worden vervangen door underscores, zodat je het script gemakkelijk kunt aanroepen. + +Als je bijvoorbeeld een eenvoudig shellscript maakt voor `sh` dialecten met de naam `apti` met +``` +sudo apt install "$1" +``` +kun je het script op elk compatibel systeem aanroepen met `apti.sh ` in een terminal sessie als het script is ingeschakeld. ## Meerdere types -Aangezien het voorbeeldbestandsscript hetzelfde is als het voorbeeldshell-script hierboven, -zie je dat je ook meerdere vakjes kunt aanvinken voor uitvoeringstypen van een script als ze in meerdere scenario's moeten worden gebruikt. - - +Je kunt ook meerdere vakjes aanvinken voor uitvoeringstypen van een script als ze in meerdere scenario's moeten worden gebruikt. diff --git a/lang/base/texts/executionType_pt.md b/lang/base/texts/executionType_pt.md index fdd4c2fb9..30ebea0f3 100644 --- a/lang/base/texts/executionType_pt.md +++ b/lang/base/texts/executionType_pt.md @@ -2,15 +2,15 @@ Podes utilizar um script em vários cenários diferentes. -Ao ativar um script, os tipos de execução ditam o que o XPipe fará com o script. +Ao ativar um script através do respetivo botão de alternância, os tipos de execução determinam o que o XPipe fará com o script. -## Scripts de inicialização +## Tipo de script de inicialização -Quando um script é designado como script de inicialização, ele pode ser selecionado em ambientes shell. +Quando um script é designado como script init, ele pode ser selecionado em ambientes shell para ser executado no init. Além disso, se um script é habilitado, ele será automaticamente executado no init em todos os shells compatíveis. -Por exemplo, se criares um script de inicialização simples como +Por exemplo, se criares um script init simples com ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` terás acesso a estes aliases em todas as sessões de shell compatíveis se o script estiver ativado. -## Scripts de shell +## Tipo de script executável -Um script de shell normal destina-se a ser chamado numa sessão de shell no teu terminal. +Um script de shell executável destina-se a ser chamado para uma determinada ligação a partir do hub de ligação. +Quando este script está ativado, o script estará disponível para ser chamado a partir do botão de scripts para uma ligação com um dialeto de shell compatível. + +Por exemplo, se você criar um script de shell de dialeto `sh` simples chamado `ps` para mostrar a lista de processos atual com +``` +ps -A +``` +podes chamar o script em qualquer conexão compatível no menu de scripts. + +## Tipo de script de arquivo + +Por fim, também podes executar um script personalizado com entradas de ficheiro a partir da interface do navegador de ficheiros. +Quando um script de ficheiro está ativado, aparece no navegador de ficheiros para ser executado com entradas de ficheiro. + +Por exemplo, se criares um script de ficheiro simples com +``` +diff "$1" "$2" +``` +podes executar o script em ficheiros seleccionados se o script estiver ativado. +Neste exemplo, o script só será executado com êxito se tiveres exatamente dois arquivos selecionados. +Caso contrário, o comando diff falhará. + +## Tipo de script da sessão do shell + +Um script de sessão destina-se a ser chamado numa sessão de shell no teu terminal. Quando ativado, o script será copiado para o sistema alvo e colocado no PATH em todas as shells compatíveis. Isto permite-te chamar o script a partir de qualquer lugar numa sessão de terminal. O nome do script será escrito em minúsculas e os espaços serão substituídos por sublinhados, permitindo-te chamar facilmente o script. -Por exemplo, se criares um script de shell simples chamado `apti` como +Por exemplo, se você criar um script de shell simples para dialetos `sh` chamado `apti` com ``` -sudo apt install "$1" +sudo apt instala "$1" ``` -podes chamar isso em qualquer sistema compatível com `apti.sh ` se o script estiver ativado. - -## Scripts de ficheiros - -Por último, também podes executar scripts personalizados com entradas de ficheiros a partir da interface do navegador de ficheiros. -Quando um script de arquivo estiver habilitado, ele aparecerá no navegador de arquivos para ser executado com entradas de arquivo. - -Por exemplo, se criares um script de arquivo simples como -``` -sudo apt install "$@" -``` -podes executar o script em ficheiros seleccionados se o script estiver ativado. - -## Vários tipos - -Como o script de arquivo de exemplo é o mesmo que o script de shell de exemplo acima, -vês que também podes assinalar várias caixas para os tipos de execução de um script, se estes tiverem de ser usados em vários cenários. +podes chamar o script em qualquer sistema compatível com `apti.sh ` numa sessão de terminal se o script estiver ativado. +## Múltiplos tipos +Também podes assinalar várias caixas para os tipos de execução de um script se estes tiverem de ser utilizados em vários cenários. diff --git a/lang/base/texts/executionType_ru.md b/lang/base/texts/executionType_ru.md index ab81514b3..eeffc645d 100644 --- a/lang/base/texts/executionType_ru.md +++ b/lang/base/texts/executionType_ru.md @@ -2,15 +2,15 @@ Ты можешь использовать скрипт в нескольких различных сценариях. -При включении скрипта типы выполнения определяют, что XPipe будет делать со скриптом. +Когда ты включаешь скрипт с помощью кнопки включения, типы выполнения определяют, что XPipe будет делать со скриптом. -## Начальные скрипты +## Тип начального сценария -Когда скрипт обозначен как init script, он может быть выбран в среде оболочки. +Когда скрипт обозначен как init script, он может быть выбран в shell-окружении для запуска при init. -Более того, если скрипт включен, он будет автоматически запускаться при init во всех совместимых оболочках. +Кроме того, если скрипт включен, он будет автоматически запускаться при init во всех совместимых оболочках. -Например, если ты создашь простой init-скрипт типа +Например, если ты создашь простой init-скрипт со значением ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` ты будешь иметь доступ к этим псевдонимам во всех совместимых сессиях оболочки, если скрипт включен. -## Скрипты оболочки +## Тип запускаемого скрипта -Обычный shell-скрипт предназначен для вызова в shell-сессии в твоем терминале. -При включении скрипта он будет скопирован в целевую систему и помещен в PATH во всех совместимых оболочках. +Запускаемый скрипт оболочки предназначен для вызова из хаба соединений для определенного соединения. +Когда этот скрипт включен, он будет доступен для вызова из кнопки scripts для соединения с совместимым диалектом оболочки. + +Например, если ты создашь простой shell-скрипт на диалекте `sh` с именем `ps` для отображения списка текущих процессов с +``` +ps -A +``` +ты сможешь вызвать этот скрипт на любом совместимом соединении в меню скриптов. + +## Тип файла скрипта + +Наконец, ты также можешь запускать пользовательский скрипт с файловыми входами из интерфейса браузера файлов. +Когда файловый скрипт включен, он будет отображаться в браузере файлов для запуска с файловыми входами. + +Например, если ты создашь простой файловый скрипт с +``` +diff "$1" "$2" +``` +ты сможешь запустить скрипт на выбранных файлах, если он включен. +В этом примере скрипт будет успешно запущен только в том случае, если у тебя выбрано ровно два файла. +В противном случае команда diff завершится неудачей. + +## Тип скрипта сеанса оболочки + +Сессионный скрипт предназначен для вызова в сеансе оболочки в твоем терминале. +Если его включить, скрипт будет скопирован в целевую систему и помещен в PATH во всех совместимых оболочках. Это позволит тебе вызывать скрипт из любого места терминальной сессии. Имя скрипта будет написано в нижнем регистре, а пробелы будут заменены на подчеркивания, что позволит тебе легко вызывать скрипт. -Например, если ты создашь простой shell-скрипт с именем `apti`, например +Например, если ты создашь простой shell-скрипт для диалектов `sh` под названием `apti` с ``` sudo apt install "$1" ``` -ты сможешь вызвать его на любой совместимой системе с помощью `apti.sh `, если скрипт включен. - -## Скрипты файлов - -Наконец, ты также можешь запускать пользовательские скрипты с файловыми входами из интерфейса файлового браузера. -Когда файловый скрипт включен, он будет отображаться в браузере файлов, чтобы его можно было запустить с файловыми входами. - -Например, если ты создашь простой файловый скрипт типа -``` -sudo apt install "$@" -``` -ты сможешь запускать скрипт на выбранных файлах, если он включен. +ты сможешь вызвать этот скрипт на любой совместимой системе с помощью `apti.sh ` в терминальной сессии, если скрипт включен. ## Несколько типов -Поскольку пример файлового скрипта такой же, как и пример shell-скрипта выше, -ты видишь, что также можешь поставить несколько галочек напротив типов выполнения скрипта, если он должен использоваться в нескольких сценариях. - - +Ты также можешь поставить несколько галочек напротив типов выполнения скрипта, если он должен использоваться в нескольких сценариях. diff --git a/lang/base/texts/executionType_tr.md b/lang/base/texts/executionType_tr.md index 0827d8112..bf8579fb2 100644 --- a/lang/base/texts/executionType_tr.md +++ b/lang/base/texts/executionType_tr.md @@ -2,15 +2,15 @@ Bir komut dosyasını birden fazla farklı senaryoda kullanabilirsiniz. -Bir komut dosyası etkinleştirilirken, yürütme türleri XPipe'ın komut dosyasıyla ne yapacağını belirler. +Bir komut dosyasını etkinleştirme geçiş düğmesi aracılığıyla etkinleştirirken, yürütme türleri XPipe'ın komut dosyasıyla ne yapacağını belirler. -## Başlangıç betikleri +## Başlangıç komut dosyası türü -Bir komut dosyası init komut dosyası olarak belirlendiğinde, kabuk ortamlarında seçilebilir. +Bir komut dosyası init komut dosyası olarak belirlendiğinde, init sırasında çalıştırılmak üzere kabuk ortamlarında seçilebilir. Ayrıca, bir betik etkinleştirilirse, tüm uyumlu kabuklarda otomatik olarak init'te çalıştırılacaktır. -Örneğin, aşağıdaki gibi basit bir init betiği oluşturursanız +Örneğin, basit bir init betiği oluşturursanız ``` alias ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias l="ls -CF" ``` betik etkinleştirilmişse, tüm uyumlu kabuk oturumlarında bu takma adlara erişebileceksiniz. -## Kabuk betikleri +## Çalıştırılabilir komut dosyası türü -Normal bir kabuk betiği, terminalinizdeki bir kabuk oturumunda çağrılmak üzere tasarlanmıştır. -Etkinleştirildiğinde, betik hedef sisteme kopyalanır ve tüm uyumlu kabuklarda PATH'e yerleştirilir. -Bu, betiği bir terminal oturumunun herhangi bir yerinden çağırmanıza olanak tanır. -Betik adı küçük harflerle yazılır ve boşluklar alt çizgi ile değiştirilir, böylece betiği kolayca çağırabilirsiniz. +Çalıştırılabilir bir kabuk betiği, bağlantı hub'ından belirli bir bağlantı için çağrılmak üzere tasarlanmıştır. +Bu komut dosyası etkinleştirildiğinde, komut dosyası, uyumlu bir kabuk lehçesine sahip bir bağlantı için komut dosyaları düğmesinden çağrılabilecektir. -Örneğin, `apti` adında aşağıdaki gibi basit bir kabuk betiği oluşturursanız +Örneğin, geçerli işlem listesini göstermek için `ps` adında basit bir `sh` dialect kabuk betiği oluşturursanız ``` -sudo apt install "$1" +ps -A ``` -betik etkinleştirilmişse bunu uyumlu herhangi bir sistemde `apti.sh ` ile çağırabilirsiniz. +komut dosyasını komut dosyaları menüsündeki herhangi bir uyumlu bağlantıda çağırabilirsiniz. -## Dosya komut dosyaları +## Dosya komut dosyası türü Son olarak, dosya tarayıcı arayüzünden dosya girdileriyle özel komut dosyası da çalıştırabilirsiniz. Bir dosya komut dosyası etkinleştirildiğinde, dosya girdileriyle çalıştırılmak üzere dosya tarayıcısında görünecektir. -Örneğin, aşağıdaki gibi basit bir dosya komut dosyası oluşturursanız +Örneğin, aşağıdakileri içeren basit bir dosya komut dosyası oluşturursanız ``` -sudo apt install "$@" +diff "$1" "$2" ``` -komut dosyası etkinleştirilmişse komut dosyasını seçilen dosyalar üzerinde çalıştırabilirsiniz. +komut dosyası etkinleştirilmişse komut dosyasını seçili dosyalar üzerinde çalıştırabilirsiniz. +Bu örnekte, komut dosyası yalnızca tam olarak iki dosya seçiliyse başarıyla çalışacaktır. +Aksi takdirde, diff komutu başarısız olacaktır. + +## Kabuk oturumu komut dosyası türü + +Bir oturum betiği, terminalinizdeki bir kabuk oturumunda çağrılmak üzere tasarlanmıştır. +Etkinleştirildiğinde, betik hedef sisteme kopyalanır ve tüm uyumlu kabuklarda PATH'e yerleştirilir. +Bu, betiği bir terminal oturumunun herhangi bir yerinden çağırmanıza olanak tanır. +Betik adı küçük harflerle yazılır ve boşluklar alt çizgilerle değiştirilir, böylece betiği kolayca çağırabilirsiniz. + +Örneğin, `sh` lehçeleri için `apti` adında basit bir kabuk betiği oluşturursanız +``` +sudo apt install "$1" +``` +betik etkinleştirilmişse, betiği herhangi bir uyumlu sistemde terminal oturumunda `apti.sh ` ile çağırabilirsiniz. ## Çoklu tipler -Örnek dosya betiği yukarıdaki örnek kabuk betiği ile aynıdır, -birden fazla senaryoda kullanılmaları gerekiyorsa, bir komut dosyasının yürütme türleri için birden fazla kutuyu da işaretleyebileceğinizi görürsünüz. - - +Birden fazla senaryoda kullanılmaları gerekiyorsa, bir komut dosyasının yürütme türleri için birden fazla kutuyu da işaretleyebilirsiniz. diff --git a/lang/base/texts/executionType_zh.md b/lang/base/texts/executionType_zh.md index 4e54998e3..07cd61408 100644 --- a/lang/base/texts/executionType_zh.md +++ b/lang/base/texts/executionType_zh.md @@ -2,15 +2,15 @@ 您可以在多种不同情况下使用脚本。 -启用脚本时,执行类型决定了 XPipe 将如何处理脚本。 +通过启用切换按钮启用脚本时,执行类型决定了 XPipe 将如何处理脚本。 -## 初始脚本 +## 初始脚本类型 -当脚本被指定为初始脚本时,它可以在 shell 环境中被选择。 +当脚本被指定为初始脚本时,可在 shell 环境中选择该脚本,以便在启动时运行。 -此外,如果脚本被启用,它将在所有兼容的 shell 中自动运行 init 脚本。 +此外,如果脚本被启用,它将在所有兼容的 shell 中自动在 init 时运行。 -例如,如果创建一个简单的启动脚本,如 +例如,如果创建一个简单的初始化脚本,使用 ``` 别名 ll="ls -l" alias la="ls -A" @@ -18,33 +18,43 @@ alias la="ls -A" ``` 如果脚本已启用,您就可以在所有兼容的 shell 会话中访问这些别名。 -##hell 脚本 +## 可运行脚本类型 -普通 shell 脚本用于在终端的 shell 会话中调用。 +可运行 shell 脚本用于从连接中心调用特定连接。 +启用该脚本后,该脚本可通过脚本按钮调用,用于兼容 shell 方言的连接。 + +例如,如果您创建了一个名为 `ps` 的简单 `sh` 方言 shell 脚本,用 +``` +ps -A +``` +就可以在脚本菜单中的任何兼容连接上调用该脚本。 + +## 文件脚本类型 + +最后,您还可以通过文件浏览器界面的文件输入运行自定义脚本。 +启用文件脚本后,该脚本将显示在文件浏览器中,可通过文件输入运行。 + +例如,如果你创建了一个简单的文件脚本,其中包含 +``` +diff "$1" "$2" +``` +的简单文件脚本,如果脚本已启用,就可以在选定的文件上运行该脚本。 +在这个示例中,只有当你正好选择了两个文件时,脚本才能成功运行。 +否则,diff 命令将失败。 + +##hell 会话脚本类型 + +会话脚本用于在终端的 shell 会话中调用。 启用后,脚本将被复制到目标系统,并放入所有兼容 shell 的 PATH 中。 -这样就可以在终端会话的任何地方调用脚本。 +这样,你就可以在终端会话的任何地方调用脚本。 脚本名称将小写,空格将用下划线代替,以便于调用脚本。 -例如,如果创建一个名为 `apti` 的简单 shell 脚本,如 +例如,如果您为`sh`方言创建了一个简单的 shell 脚本,名为`apti`,其中包含 ``` sudo apt install "$1" ``` -如果脚本已启用,你就可以在任何兼容系统上使用 `apti.sh ` 调用该脚本。 - -## 文件脚本 - -最后,你还可以通过文件浏览器界面的文件输入运行自定义脚本。 -启用文件脚本后,它将显示在文件浏览器中,可通过文件输入运行。 - -例如,如果你创建了一个简单的文件脚本,如 -``` -sudo apt install "$@" -``` -这样的简单文件脚本,如果脚本已启用,你就可以在选定的文件上运行该脚本。 +如果脚本已启用,你就可以在终端会话中使用 `apti.sh ` 在任何兼容系统上调用该脚本。 ## 多种类型 -由于示例文件脚本与上述示例 shell 脚本相同、 -你可以看到,如果脚本应在多种情况下使用,你也可以为脚本的执行类型勾选多个复选框。 - - +如果脚本需要在多种情况下使用,还可以勾选脚本执行类型的多个复选框。