Script rework

This commit is contained in:
crschnick 2024-07-28 19:48:24 +00:00
parent 0014bf6165
commit 544dc85e6f
47 changed files with 908 additions and 413 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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);
});
}

View file

@ -121,7 +121,11 @@ public interface ActionProvider {
interface BranchDataStoreCallSite<T extends DataStore> extends DataStoreCallSite<T> {
List<ActionProvider> getChildren();
default boolean isDynamicallyGenerated(){
return false;
}
List<? extends ActionProvider> getChildren(DataStoreEntryRef<T> store);
}
interface LeafDataStoreCallSite<T extends DataStore> extends DataStoreCallSite<T> {
@ -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();

View file

@ -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);
}

View file

@ -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);
}

View file

@ -152,7 +152,7 @@ public interface OsType {
public List<String> 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

View file

@ -32,12 +32,6 @@ public class EditStoreAction implements ActionProvider {
return DataStore.class;
}
@Override
public boolean isMajor(DataStoreEntryRef<DataStore> o) {
var provider = o.get().getProvider();
return provider.shouldEdit();
}
@Override
public ObservableValue<String> getName(DataStoreEntryRef<DataStore> store) {
return AppI18n.observable("base.edit");

View file

@ -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> 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<ShellStore>() {
@Override
public Action createAction(DataStoreEntryRef<ShellStore> store) {
return new Action(store);
}
@Override
public ObservableValue<String> getName(DataStoreEntryRef<ShellStore> store) {
return new SimpleStringProperty(hierarchy.getBase().get().getName());
}
@Override
public String getIcon(DataStoreEntryRef<ShellStore> 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<ShellStore>() {
@Override
public Class<ShellStore> getApplicableClass() {
return ShellStore.class;
}
@Override
public ObservableValue<String> getName(DataStoreEntryRef<ShellStore> store) {
return new SimpleStringProperty(hierarchy.getBase().get().getName());
}
@Override
public boolean isDynamicallyGenerated() {
return true;
}
@Override
public String getIcon(DataStoreEntryRef<ShellStore> store) {
return "mdi2p-play-box-multiple-outline";
}
@Override
public List<? extends ActionProvider> getChildren(DataStoreEntryRef<ShellStore> store) {
return hierarchy.getChildren().stream().map(c -> new ScriptAction(c)).toList();
}
};
}
}
@Override
public BranchDataStoreCallSite<?> getBranchDataStoreCallSite() {
return new BranchDataStoreCallSite<ShellStore>() {
@Override
public Class<ShellStore> getApplicableClass() {
return ShellStore.class;
}
@Override
public boolean isMajor(DataStoreEntryRef<ShellStore> o) {
return true;
}
@Override
public ObservableValue<String> getName(DataStoreEntryRef<ShellStore> store) {
return AppI18n.observable("runScript");
}
@Override
public boolean isDynamicallyGenerated() {
return true;
}
@Override
public String getIcon(DataStoreEntryRef<ShellStore> store) {
return "mdi2p-play-box-multiple-outline";
}
@Override
public List<? extends ActionProvider> getChildren(DataStoreEntryRef<ShellStore> 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();
}
};
}
}

View file

@ -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<BrowserEntry> entries);
protected abstract String getTerminalTitle();
@Override
public List<LeafAction> getBranchingActions(OpenFileSystemModel model, List<BrowserEntry> entries) {
return List.of(
new LeafAction() {
@Override
public void execute(OpenFileSystemModel model, List<BrowserEntry> 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<String> getName(OpenFileSystemModel model, List<BrowserEntry> entries) {
var t = AppPrefs.get().terminalType().getValue();
return AppI18n.observable(
"executeInTerminal",
t != null ? t.toTranslatedString().getValue() : "?");
}
@Override
public boolean isApplicable(OpenFileSystemModel model, List<BrowserEntry> entries) {
return AppPrefs.get().terminalType().getValue() != null;
}
},
new LeafAction() {
@Override
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) {
model.withShell(
pc -> {
var cmd = createCommand(pc, model, entries);
pc.command(cmd)
.withWorkingDirectory(model.getCurrentDirectory()
.getPath())
.execute();
},
false);
}
@Override
public ObservableValue<String> getName(OpenFileSystemModel model, List<BrowserEntry> entries) {
return AppI18n.observable("executeInBackground");
}
});
}
}

View file

@ -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);

View file

@ -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;

View file

@ -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<BrowserEntry> entries) {
var sc = model.getFileSystem().getShell().orElseThrow();
return model.getBrowserModel() instanceof BrowserSessionModel
&& !getInstances(sc).isEmpty();
}
private Map<String, SimpleScriptStore> getInstances(ShellControl sc) {
var scripts = ScriptStore.flatten(ScriptStore.getDefaultEnabledScripts());
var map = new LinkedHashMap<String, SimpleScriptStore>();
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<BranchAction> getBranchingActions(OpenFileSystemModel model, List<BrowserEntry> entries) {
var sc = model.getFileSystem().getShell().orElseThrow();
var scripts = getInstances(sc);
List<BranchAction> actions = scripts.entrySet().stream()
.map(e -> {
return new MultiExecuteAction() {
@Override
public ObservableValue<String> getName(OpenFileSystemModel model, List<BrowserEntry> 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<? extends BrowserAction> getBranchingActions(OpenFileSystemModel model, List<BrowserEntry> entries) {
var actions = createActionForScriptHierarchy(model, entries);
return actions;
}
private List<? extends BrowserAction> createActionForScriptHierarchy(OpenFileSystemModel model, List<BrowserEntry> 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<? extends BrowserAction> getBranchingActions(OpenFileSystemModel model, List<BrowserEntry> entries) {
return list;
}
@Override
public ObservableValue<String> getName(OpenFileSystemModel model, List<BrowserEntry> entries) {
var b = hierarchy.getBase();
return new SimpleStringProperty(b != null ? b.get().getName() : null);
}
};
}
private BranchAction createActionForScript(OpenFileSystemModel model, DataStoreEntryRef<SimpleScriptStore> ref) {
return new MultiExecuteSelectionAction() {
@Override
public ObservableValue<String> getName(OpenFileSystemModel model, List<BrowserEntry> entries) {
return new SimpleStringProperty(ref.get().getName());
}
@Override
protected CommandBuilder createCommand(ShellControl sc, OpenFileSystemModel model, List<BrowserEntry> 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();
}
};
}
}

View file

@ -25,7 +25,7 @@ public class ScriptGroupStore extends ScriptStore implements GroupStore<ScriptSt
}
@Override
protected void queryFlattenedScripts(LinkedHashSet<SimpleScriptStore> all) {
protected void queryFlattenedScripts(LinkedHashSet<DataStoreEntryRef<SimpleScriptStore>> all) {
getEffectiveScripts().forEach(simpleScriptStore -> {
simpleScriptStore.getStore().queryFlattenedScripts(all);
});
@ -35,6 +35,7 @@ public class ScriptGroupStore extends ScriptStore implements GroupStore<ScriptSt
public List<DataStoreEntryRef<ScriptStore>> getEffectiveScripts() {
var self = getSelfEntry();
return DataStorage.get().getDeepStoreChildren(self).stream()
.filter(entry -> entry.getValidity().isUsable())
.map(dataStoreEntry -> dataStoreEntry.<ScriptStore>ref())
.toList();
}

View file

@ -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<DataStoreEntryRef<SimpleScriptStore>> include) {
var all = new HashSet<>(ScriptStore.getEnabledScripts());
// Add individual children of groups
// This is not recursive
for (DataStoreEntryRef<ScriptStore> ref : new HashSet<>(all)) {
if (ref.getStore() instanceof ScriptGroupStore groupStore) {
all.addAll(groupStore.getEffectiveScripts());
}
}
// Add parents
for (DataStoreEntryRef<ScriptStore> 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<ScriptStore> ref, Predicate<DataStoreEntryRef<ScriptStore>> 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<? extends ScriptStore> base;
List<ScriptHierarchy> 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<SimpleScriptStore> getLeafBase() {
return base.get().ref();
}
}

View file

@ -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<SimpleScriptStore> scriptStores)
private static String initScriptsDirectory(ShellControl proc, List<DataStoreEntryRef<SimpleScriptStore>> 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.<SimpleScriptStore>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<DataStoreEntryRef<ScriptStore>> getDefaultEnabledScripts() {
public static List<DataStoreEntryRef<ScriptStore>> 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::<ScriptStore>ref)
.toList();
}
public static List<SimpleScriptStore> flatten(List<DataStoreEntryRef<ScriptStore>> scripts) {
var seen = new LinkedHashSet<SimpleScriptStore>();
public static List<DataStoreEntryRef<SimpleScriptStore>> flatten(List<DataStoreEntryRef<ScriptStore>> scripts) {
var seen = new LinkedHashSet<DataStoreEntryRef<SimpleScriptStore>>();
scripts.forEach(scriptStoreDataStoreEntryRef ->
scriptStoreDataStoreEntryRef.getStore().queryFlattenedScripts(seen));
var dependencies = new HashMap<ScriptStore, Set<SimpleScriptStore>>();
seen.forEach(simpleScriptStore -> {
var f = new HashSet<>(simpleScriptStore.queryFlattenedScripts());
f.remove(simpleScriptStore);
dependencies.put(simpleScriptStore, f);
var dependencies = new HashMap<DataStoreEntryRef<? extends ScriptStore>, Set<DataStoreEntryRef<SimpleScriptStore>>>();
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<SimpleScriptStore> queryFlattenedScripts() {
var seen = new LinkedHashSet<SimpleScriptStore>();
SequencedCollection<DataStoreEntryRef<SimpleScriptStore>> queryFlattenedScripts() {
var seen = new LinkedHashSet<DataStoreEntryRef<SimpleScriptStore>>();
queryFlattenedScripts(seen);
return seen;
}
protected abstract void queryFlattenedScripts(LinkedHashSet<SimpleScriptStore> all);
protected abstract void queryFlattenedScripts(LinkedHashSet<DataStoreEntryRef<SimpleScriptStore>> all);
public abstract List<DataStoreEntryRef<ScriptStore>> getEffectiveScripts();
}

View file

@ -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<SimpleScriptStore> all) {
public void queryFlattenedScripts(LinkedHashSet<DataStoreEntryRef<SimpleScriptStore>> all) {
// Prevent loop
all.add(this);
DataStoreEntryRef<SimpleScriptStore> 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<DataStoreEntryRef<ScriptStore>> 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<String> terminalContent(ShellControl shellControl) {
return Optional.ofNullable(assemble(shellControl));
return Optional.ofNullable(assembleScriptChain(shellControl));
}
}

View file

@ -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<Integer>();
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<Integer, String>() {
@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)

View file

@ -35,7 +35,7 @@ public class ServiceOpenAction implements ActionProvider {
}
@Override
public List<ActionProvider> getChildren() {
public List<ActionProvider> getChildren(DataStoreEntryRef<DataStore> store) {
return List.of(new ServiceOpenHttpAction(), new ServiceOpenHttpsAction());
}
};

View file

@ -72,6 +72,7 @@ open module io.xpipe.ext.base {
ServiceCopyUrlAction,
CloneStoreAction,
RefreshChildrenStoreAction,
RunScriptActionMenu,
LaunchStoreAction,
XPipeUrlAction,
EditStoreAction,

View file

@ -0,0 +1 @@
sudo apt update && sudo apt upgrade

View file

@ -0,0 +1 @@
diff "$1" "$2"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -144,7 +144,8 @@ openWebsite=オープンウェブサイト
customServiceGroup.displayName=サービスグループ
customServiceGroup.displayDescription=複数のサービスを1つのカテゴリーにまとめる
initScript=initスクリプト - シェルのinit時に実行する
shellScript=セッションスクリプト - シェルセッション中にスクリプトを利用可能にする
shellScript=シェルセッションスクリプト - シェルセッション中に実行可能なスクリプトを作成する。
runnableScript=実行可能なスクリプト - 接続ハブからスクリプトを直接実行できるようにする
fileScript=ファイルスクリプト - ファイルブラウザでファイル引数を指定してスクリプトを呼び出せるようにする
runScript=スクリプトを実行する
copyUrl=URLをコピーする

View file

@ -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

View file

@ -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

View file

@ -144,7 +144,8 @@ openWebsite=Открытый сайт
customServiceGroup.displayName=Группа услуг
customServiceGroup.displayDescription=Сгруппируйте несколько сервисов в одну категорию
initScript=Init script - скрипт, запускаемый при инициализации оболочки
shellScript=Скрипт сессии - сделай скрипт доступным во время сеанса работы с оболочкой
shellScript=Скрипт сеанса оболочки - сделать скрипт доступным для выполнения во время сеанса оболочки
runnableScript=Запускаемый скрипт - позволяет запускать скрипт прямо из концентратора соединений
fileScript=Файловый скрипт - позволяет вызывать скрипт с аргументами файла в файловом браузере
runScript=Запуск скрипта
copyUrl=Копировать URL

View file

@ -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

View file

@ -144,7 +144,8 @@ openWebsite=打开网站
customServiceGroup.displayName=服务组
customServiceGroup.displayDescription=将多项服务归为一类
initScript=初始脚本 - 在 shell 启动时运行
shellScript=会话脚本 - 在 shell 会话期间提供脚本
shellScript=shell 会话脚本 - 在 shell 会话中运行脚本
runnableScript=可运行脚本 - 允许从连接集线器直接运行脚本
fileScript=文件脚本 - 允许在文件浏览器中使用文件参数调用脚本
runScript=运行脚本
copyUrl=复制 URL

View file

@ -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 <pkg>`, 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 <pkg>` 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.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>`を使ってそれを呼び出すことができる。
## ファイルスクリプト
最後に、ファイルブラウザのインターフェイスからファイル入力を使ってカスタムスクリプトを実行することもできる。
ファイルスクリプトが有効になると、ファイルブラウザに表示され、ファイル入力で実行できるようになる。
例えば、次のような簡単なファイルスクリプトを作成した場合
```
sudo apt install "$@"
```
スクリプトが有効になっていれば、選択したファイルに対してスクリプトを実行できる。
スクリプトが有効になっていれば、ターミナルセッションで`apti.sh <pkg>`を使って互換性のあるシステム上でスクリプトを呼び出すことができる。
## 複数のタイプ
ファイルスクリプトのサンプルは、上のシェルスクリプトのサンプルと同じである、
スクリプトを複数のシナリオで使用する場合は、スクリプトの実行タイプに複数のチェックボックスを付けることもできる。
スクリプトを複数のシナリオで使用する場合、スクリプトの実行タイプに複数のチェックを入れることもできる。

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>`, если скрипт включен.
## Скрипты файлов
Наконец, ты также можешь запускать пользовательские скрипты с файловыми входами из интерфейса файлового браузера.
Когда файловый скрипт включен, он будет отображаться в браузере файлов, чтобы его можно было запустить с файловыми входами.
Например, если ты создашь простой файловый скрипт типа
```
sudo apt install "$@"
```
ты сможешь запускать скрипт на выбранных файлах, если он включен.
ты сможешь вызвать этот скрипт на любой совместимой системе с помощью `apti.sh <pkg>` в терминальной сессии, если скрипт включен.
## Несколько типов
Поскольку пример файлового скрипта такой же, как и пример shell-скрипта выше,
ты видишь, что также можешь поставить несколько галочек напротив типов выполнения скрипта, если он должен использоваться в нескольких сценариях.
Ты также можешь поставить несколько галочек напротив типов выполнения скрипта, если он должен использоваться в нескольких сценариях.

View file

@ -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 <pkg>` 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 <pkg>` 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.

View file

@ -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 <pkg>` 调用该脚本。
## 文件脚本
最后,你还可以通过文件浏览器界面的文件输入运行自定义脚本。
启用文件脚本后,它将显示在文件浏览器中,可通过文件输入运行。
例如,如果你创建了一个简单的文件脚本,如
```
sudo apt install "$@"
```
这样的简单文件脚本,如果脚本已启用,你就可以在选定的文件上运行该脚本。
如果脚本已启用,你就可以在终端会话中使用 `apti.sh <pkg>` 在任何兼容系统上调用该脚本。
## 多种类型
由于示例文件脚本与上述示例 shell 脚本相同、
你可以看到,如果脚本应在多种情况下使用,你也可以为脚本的执行类型勾选多个复选框。
如果脚本需要在多种情况下使用,还可以勾选脚本执行类型的多个复选框。